线程池 ExecutorService
线程池主要解决两个问题:
- 1:重用线程
- 2:控制线程数量
当同时并发运行的任务过多时,若对应的创建了相应数量的线程会引发诸多不利问题.
- 1:CPU过度切换,由于所有线程都是CPU执行,那么线程过多,会导致CPU轮询执行效率下降,出现"卡顿"现象
- 2:每条线程都需要占用一定的内存,那么线程过多可能会导致内存溢出.
- 3:频繁的创建及销毁线程还会给线程调度带来负担,拖慢系统.
创建线程池
创建一个固定大小的线程池:
ExecutorService threadPool= Executors.newFixedThreadPool(2);
for(int i=0;i<5;i++){
Runnable runn = new Runnable(){
public void run(){
try {
Thread t = Thread.currentThread();
System.out.println(
t.getName()+":正在执行任务...");
/*
* 当一个线程正处于阻塞状态
* 时被中断,会抛出中断异常
* InterruptedException
*/
Thread.sleep(5000);
System.out.println(
t.getName()+":执行任务完毕!");
} catch (Exception e) {
System.out.println("线程被中断了!");
}
}
};
将任务指派给线程池运行:
threadPool.execute(runn);
停止线程池有两个方法:
shutdown,shutdownNow
- shutdown:当线程池所有任务执行完毕后停止。调用该方法后线程池不再接受新的任务
- shutdownNow:立刻停止线程池,线程池会将内部所有线程强制中断.
threadPool.shutdownNow();