几种常见的延迟执行处理方式 -- DelayQueue介绍
2、https://blog.csdn.net/c15158032319/article/details/118636233
1、https://blog.csdn.net/fuzhongmin05/article/details/105716205
3、https://blog.csdn.net/fuzhongmin05/article/details/105716205
4、https://mp.weixin.qq.com/s?__biz=MjM5NzMyMjAwMA==&mid=2651518102&idx=1&sn=e97e4e66d661c880fc24e494b1fc1088&chksm=bd2598e98a5211ff30423bf631570824b0e1a54ae194408d00e27c7e1edb10e4fec8a9fb63aa&scene=27
5、https://www.cnblogs.com/fuunnyy/p/17259019.html
- Executors.newScheduledThreadPool().schedule():使用 ScheduledExecutorService 对象来实现延迟执行,可以指定延迟时间和执行周期。
优点:可以在任何线程中使用,支持周期性执行任务,可以控制线程池的大小。
缺点:相对于 Timer 对象,使用 ScheduledExecutorService 对象需要更多的代码。
应用场景:需要在子线程中延迟执行一些任务,如定时任务、周期性任务等。
示例代码:
java
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.schedule(new Runnable() {
@Override
public void run() {
// 延迟执行的操作
}
}, 1000, TimeUnit.MILLISECONDS); // 延迟 1 秒钟执行
选择延迟执行方法需要根据具体的应用场景来决定。如果需要在主线程中延迟执行操作,则可以使用 Handler.postDelayed() 方法;如果需要在子线程中延迟执行、周期性操作,则可以使用 Timer.schedule() 或 Executors.newScheduledThreadPool().schedule() 方法
https://blog.csdn.net/weixin_34273481/article/details/92812066
1、找到进程号
ps -mp 35163 -o THREAD,tid,time
2、找到问题线程
线程TID转16进制
[user111@kms210 lms]$ printf "%x\n" 35204
8984
3、 jstack 进程 | grep 线程 -A 30
jstack 35163 | grep 8984 -A 30
https://www.codenong.com/cs109670197/
线程池应该设置多少才合理
我们常常会问多线程相关知识,那么线程池的设置问题就避免不了,那么,我们应该怎么回答或者怎么思考解决这个问题呢?
其实这个问题反映的是如何设置使得计算机资源利用率最大化。
我们回答的时候可以说:
为了提高 CPU 的利用率,一般我们可以设置线程池的为CPU核心数或者核心数的2倍。
线程池的理想大小 取决于提交任务的类型以及所部署系统的特性,不应该在程序中写死,
线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程
我们要根据任务是 :计算密集型 or I/O密集型 来设置线程池的大小。
计算密集型是指处理这种任务时,线程不会发生阻塞,线程不阻塞就一定程度代表 CPU 一直在忙碌;
I/O 密集型 是指运行该类任务时线程多会发生阻塞,一旦阻塞,CPU 就多被闲置,浪费 CPU 资源。
通俗的说:
一些进程绝大多数时间在计算上,称为计算密集型(CPU密集型)computer-bound。
而有一些进程则在input 和output上花费了大多时间,称为I/O密集型,I/O-bound。比如搜索引擎蜘蛛大多时间是在等待相应这种就属于I/O密集型。
当是i/o密集性时,等待时间更长,需要线程数就更多,所以我们可以设置为2倍,
而计算机密集型,执行速度很快,但是不停的执行,基本上CPU都是满负荷运行,那么核心数即线程数就更为合适。