【Java】获取有效的异常调用堆栈信息
项目中,可能会遇到虽然知道发生了异常,但是不知道异常是什么,由于调用栈信息不全,从日志上看不出具体问题;主要原因是异常调用栈太深,导致异常信息被截断。
下面这个方法可以获取根异常,将中间的非主要异常过滤掉。
1 | /** |
示例
1 |
|
1 | 10:38:13.122 [main] WARN com.coocaa.media.sync.ThrowableTestDemo - 处理前: |
项目中,可能会遇到虽然知道发生了异常,但是不知道异常是什么,由于调用栈信息不全,从日志上看不出具体问题;主要原因是异常调用栈太深,导致异常信息被截断。
下面这个方法可以获取根异常,将中间的非主要异常过滤掉。
1 | /** |
示例
1 | @Slf4j |
1 | 10:38:13.122 [main] WARN com.coocaa.media.sync.ThrowableTestDemo - 处理前: |
封装一个 set 对象构建器,利用类的 set 引用方法(不局限 set 开头的方法)来设值,便于点式调用。
1 |
|
1 | /** |
对于多个独立的任务,可以以并发的方式执行任务,以提高 CPU 利用率,提高处理效率。
在一个线程池中,开启指定数量的线程,每个线程从任务队列中获取任务执行。
执行的过程中,判断当前线程是否在执行任务的状态,如果没有执行任务,取一条任务执行,如果正在执行,则跳过,下轮再判断。
在所有任务执行完后,关闭线程池。
需要注意的是数据结构的选择,须选择并发类的数据结构,不然可能出现阻塞,死锁等情况。
(具体逻辑参考源码)
1 | /** |
测试结果
1 | pool-1-thread-1-value:0 |
基于自定义的 queue 实现
1 |
|
基于 executorService.invokeAll
1 | package com.lyloou.component.util.concurrent; |
编写代码时,会经常需要编写两个对象是否相等的逻辑,一般会有如下做法
上面这些做法,都比较复杂,如果属性太多或复杂点(如果是 list 和 map 就更复杂了),就需要编写更多的判断逻辑代码了。
如果能只需要提供比较的方法引用列表,有个地方能自动方法引用取值,并比较就好了。
1 | @Getter |
1 | @Getter |
1 | @Getter |
这样就简洁很多了,由于 ignoreEqualsTo 和 onlyEqualsTo 方法是 Equable 接口中的默认方法,具体逻辑全封装起来了(包括 object, collection 和 map 的处理),不需要重写就可以直接使用,具体实现看下面的源码。
1 |
|
方法 1:
方法 2:
frps 是一个优秀的内网穿透软件。
frps 下载安装:https://github.com/fatedier/frp/releases
服务端: ./frps -c ./frps.ini
frps.ini
1 | [common] |
客户端: ./frpc -c ./frpc.ini
frpc.ini
1 | [common] |
访问服务器端的 dashboard 查看统计信息: http://frps.example.com:7500/
访问内网 ssh: ssh -oPort=7022 test@x.x.x.x
通过浏览器访问内网机器: http://office.frps.example.com:2780/
安装 supervisor
1 | apt install supervisor |
添加 frps 配置:vi /etc/supervisor/conf.d/frps.conf
1 | [program:frps] |
可以依次运行下面操作加载 新加入的 frps
1 | # 告诉 supervisor 新加了配置 |
输入 supervisorctl 查看 frps 是否已运行
start 和 stop frps
设置 supervisor 开机启动
1 | systemctl enable supervisor.service |
为 supervisor 添加 dashboard,通过 9001 来访问:
vi /etc/supervisor/supervisord.conf
添加下面代码
1 | [inet_http_server] |
https://github.com/fatedier/frp
通过 frp 实现访问内网 ssh 与 http 简明教程 - 简书
How to Install and Configure Supervisor on Ubuntu 20.04 | Atlantic.Net
1 | [program:nginx] |
使用 supervisor 设置服务端 frp 开机启动 - 一只猿 - 前端攻城尸 | 安全研究员 | 硬件控 | 业余极客 | 开源拥护者
进入:edge://flags/
disable Microsoft Edge scrolling personality
Win11 恢复 Win10 经典右键菜单 亲测有效_admans 的专栏-CSDN 博客_win11 换回 win10 右键
管理员权限运行
1 | reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve |
重启资源管理器:taskkill /f /im explorer.exe&&explorer.exe
cmd /c taskkill /f /im explorer.exe&&explorer.exe 这命令什么意思_百度知道
恢复 win11
1 | reg.exe delete "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /va /f |
其它方案:startAllback 软件
描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true ,否则返回 false 。假设输入的数组的任意两个数字都互不相同。
数据范围: 节点数量 0≤n≤1000 ,节点上的值满足 1≤val≤10^5,保证节点上的值各不相同
要求:空间复杂度 O(n) ,时间时间复杂度 O(n^2)
提示:
1.二叉搜索树是指父亲节点大于左子树中的全部节点,但是小于右子树中的全部节点的树。
2.该题我们约定空树不是二叉搜索树
3.后序遍历是指按照 “左子树-右子树-根节点” 的顺序遍历
4.参考下面的二叉搜索树,示例 1
1 | /** |
1 | package algorithm.jzoffer; |
1 | package algorithm.jzoffer; |
描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下 4 X 4 矩阵:
1 | [[1,2,3,4], |
则依次打印出数字
[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]
数据范围:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
例如:
1 | public class Jz29_2 { |
1 | public class Jz29_4 { |