java线程池最大作用就是管理线程,控制线程数,实现高并发
首先最基本的创建线程池方式
ThreadPoolExecutor pool = new ThreadPoolExecutor(1,2,60, TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>());
参数1:核心线程数
参数2:最大线程数,当任务队列满的时候,是否创建线程,创建线程的数量由他控制(最大线程数>=核心线程数)
参数3:超过核心线程数的线程空闲存活时间
参数4:时间单位
参数5:存储任务的队列,当来的任务大于核心线程数时,将任务暂存在队列中
这是创建线程最原始的方式,项目中一般都会用Executors创建线程
1.创建可变线程池 ExecutorService pool1 = Executors.newCachedThreadPool();
实现的底层是还是用ThreadPoolExecutor,只不过是固定参数而已:
new ThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.SECONDS,new SynchronousQueue<Runnable>());
SynchronousQueue 为无缓冲队列
2.创建固定线程池 ExecutorService pool2 = Executors.newFixedThreadPool(10); //这种方式比较常用
实现的底层是还是用ThreadPoolExecutor,核心线程数=最大线程数:
new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
LinkedBlockingQueue(队列大小) 如果不传参数队列大小默认为 Integer.MAX_VALUE
3.创建单线程池 ExecutorService pool3 = Executors.newSingleThreadExecutor();
实现底层 核心线程数=最大线程数=1
new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()));
控制线程数为1,多余的任务入队列等待,还是用的LinkedBlockingQueue
最后执行线程池中的线程任务:
pool.execute(new Runnable()); 没有返回值
pool.submit(new Callable()); 有返回值
这里队列没有细说,等有时间在总结队列相关,有问题的可以进行评论,多多指教