作为一个java小白来说,用的线程池很多,但是好多原理并不是很清楚,趁着有点时间,研究了一下下,有问题各位大佬多多指点!!!
Java通过Executors提供四种线程池,分别为:
一,newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
这个线程池最大数量为2147483647(Interger. MAX_VALUE),我确实不敢想象啥项目能用那么多线程,但是人家自动创建,空闲一分钟销毁了,还是不错的,用它只有一点要注意,就是同时执行的任务数量不要过多,否则,由于大量线程同时运行,很有会造成系统瘫痪。
二,newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。(项目几乎都用到这个,别的没怎么涉及。)
这种是我经常用的,代码如下:
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
for (int i=0;i<10;i++){
fixedThreadPool.execute(new Runnable() {
public void run() {
try {
System.out.println("B当前时间="+new Date());
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
我们一般是在定时任务时用到了多线程,定时任务触发时,这线程池把线程数量可以做一个限制线程最大数量就是5,如上面代码,有任务进来就创建线程,到5个就不创建了,挂了一个线程就在创建一个,根据实际项目的情况设定线程数量,我觉得很好用。三和四还没看完,看完了继续写。
三,newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
四,newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。