为什么要使用线程池,先看看线程的有点:
1、降低资源消耗:通过复用已存在的线程,降低了线程创建和销毁造成的资源消耗
2、线程管理得到优化:线程池有效管理线程数量,资源统一调配,提供资源使用率。不会出现因过度创建线程资源耗尽而导致oom,从而提高系统的稳定性
3、简化了多线程的使用方法,降低了多线程的使用门槛。
4、使用线程池,可以使代码简单、优雅
java Executors 的四种线程池:
1、newCachedThreadPool
可缓存线程池:当有新任务提交时,有空闲线程就直接复用,没有空闲线程则创建新的线程来处理任务,队列中不储存任务,线程池不对大小做限制,线程池大小完全依赖于操作系统(理论上大小是Integer.MAX_VALUE)。如果线程空闲时间超过60s就会被回收。
2、newFixedThreadPool
指定大小的线程池:有新任务提交就创建一个新线程,当线程数量到设置的最大值时,再有提交新任务就会放入LinkedBlockingQueue 阻塞队列中,等到有空闲线程时,再从队列中取出任务继续执行。
3、newScheduledThreadPool
定长线程池:可指定线程池大小,支持定时及周期性任务
4、newSingleThreadExecutor
单线程线程池:只有一个线程,用仅有的一个线程来执行任务,保证所有任务按指定的顺序执行,新提交的所有任务会保存在LinkedBlockingQueue阻塞队列中,等待唯一的线程空闲后来执行
线程池的使用方法:(以newFixedThreadPool为例)
//创建缓存线程池
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
//创建定时调度线程池
ExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(10);
// 创建单一线程的线程池
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
// 创建固定大小的线程池
ExecutorService threadPool = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
threadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println("Thread name==" + Thread.currentThread().getName());
}
});
}
threadPool.shutdown();