前言
一个使用Java开发的系统,一般情况下是不允许无限制地创建线程的,会去创建一个线程池,其中有一定数量的线程,让它们去执行各种各样的任务,线程执行完任务之后,不要销毁掉自己,而是继续去等待执行下一个任务。
线程池工作的原理
简单创建线程池的方法如:
ExecutorService threadPool = Executors.newFixedThreadPool(3);
//提交任务
threadPool.submit(任务);
原理:
1、提交任务时,先判断线程池中线程的数量是否小于corePoolSize,也就是代码中定义的3,如果小于的话,就会直接创建一个线程出来执行提交上来的任务;
2、在执行完提交的任务之后,这个线程不会被销毁掉,而是会尝试从一个无界的LinkedBlockingQueue队列里获取新的任务,如果没有新的任务,就会阻塞住,等待新的任务到来;
3、持续提交任务,1、2中的流程反复执行,只要线程池的线程数量小于corePoolSize,都会直接创建新线程来执行这个任务,执行完了就尝试从无界队列里获取任务,直到线程池中的线程数量达到corePoolSize个为止;
4、当线程池中的线程都有在执行的任务时,会把多出来的任务放入等待队列中,线程执行完当前任务后,会从等待队列中拿出未完成的任务去执行,如果所有线程都一直在忙碌,任务又一直叠加,则等待队列中的任务数量会越来越多。