线程池的好处:
1.减少系统资源消耗:线程池中线程能够被复用,不需要每次创建一个线程执行任务,执行完任务之后进行线程销毁,减少线程创建与线程销毁带来的系统开销以及时间片轮转和上下文切换带来的开销;
2.提高执行任务的响应速度:将任务提交到线程池中,一旦线程池中有空闲线程,可以直接调用线程执行任务,节省线程创建所带来的时间;
3.线程的统一调度管理:能够对线程池中的线程都进行统一的管理、调度以及销毁;
线程池的状态:
1.RUNNING:接受新的任务,执行任务队列里面的任务;
2.SHUDOWN:不再接受新的任务,但会执行任务队列里面的任务;
3.STOP:不再接受新的任务,也不执行任务队列里面的任务;同时中断正在执行的任务;
4.TIDYING:所有的任务已经完成,工作线程为0;TIDYING会调用terminated()进入TERMINATED状态;
5.TERMINATED:terminated()函数执行完成,线程池终止;
线程池状态间的转换:
RUNNING -> SHUTDOWN:调用shutdown()函数
RUNNING -> STOP:调用shutdownNow()函数
SHUTDOWN -> STOP:调用shutdownNow()函数
SHUTDOWN -> TIDYING:任务队列和工作线程都为空(等待任务队列里面的任务执行完成,工作线程终止)
STOP -> TIDYING:工作线程都为空(当进入STOP状态后中断所有工作线程进入TIDYING)
TIDYING -> TERMINATED:调用terminated()函数执行完成(进入TIDYING状态会调用terminated()函数)
LinkedBlockingQueue<Runnable> taskQueue = new LinkedBlockingQueue<Runnable>();
ThreadPoolExecutor fixedThreadPool = new ThreadPoolExecutor(50, 50,0L, TimeUnit.MILLISECONDS,taskQueue);
try {
for (int i = 0; i < mapList.size(); i++) {
final int index = i;
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
//业务逻辑处理
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
});
}
fixedThreadPool.shutdown();
while(true){
if(fixedThreadPool.isTerminated()){
break;
}
}
}catch (Exception e){
log.error(e.getMessage(), e);
}