Java线程池是java重点知识,在java中我们经常需要用到多线程来处理一些业务,提高工程响应速度,所以对于java线程池的工作原理要十分清楚,那java线程池工作原理是什么?下面来我们就来给大家讲解一下。
线程池刚被创建的时候,只是向系统里申请一个用于执行流程队列和管理线程池的线程资源。在调用execute()添加一个任务时,线程池会按照以下流程执行:
1、如果正在运行的线程数少于corePoolSize(用户定义的核心线程数),线程池就会立刻创建线程并执行该线程任务;
2、如果正在运行的线程数大于corePoolSize,该任务就会被放入阻塞队列中;
3、如果阻塞队列已满且正在运行的线程数少于maximumPoolSize时,线程池会创建非核心线程立刻执行该线程任务;
4、在阻塞队列已满并且正在运行的线程数大于maximunPoolSize时,线程池将会拒绝执行该任务并且抛出拒绝异常RejectExecutionException;
5、在线程执行完毕后,该任务会从线程队列中移除,然后从队列中取下一个任务继续执行;
6、在线程处于空闲的时间超过keepAliveTime,并且正在运行的线程数大于corePoolSize, 该线程将会被认为是空闲线程并停止;所以线程任务都执行完毕后,线程池会收缩到corePoolSize大小。
java如何实现一个线程池?
1、创建任务
class worker implements Runnable { @Override public void run() { System.out.println(Thread.currentThread() .getName()); } }
2、创建线程池,并将任务传递进去
public class Test { private static final int corePoolSize = 4; private static final int maximumPoolSize = 6; private static final long keepAliveTime = 2; private static final TimeUnit unit = TimeUnit.SECONDS; private static final int QueueSize = 5; //将参数设定为固定值 public static void main(String[] args) { ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize , maximumPoolSize , keepAliveTime , unit , new ArrayBlockingQueue < > (QueueSize) , new ThreadPoolExecutor.CallerRunsPolicy() ); //构造线程池 for (int i = 0; i < 10; i++) { worker w = new worker(); executor.execute(w); } //传入10个任务 executor.shutdown(); //关闭线程池 while (!executor.isTerminated()) {} System.out.println("finish"); } }
3、运行结果
pool - 1 - thread - 4 pool - 1 - thread - 2 pool - 1 - thread - 3 pool - 1 - thread - 1 pool - 1 - thread - 5 pool - 1 - thread - 1 pool - 1 - thread - 4 pool - 1 - thread - 5 pool - 1 - thread - 3 pool - 1 - thread - 2 finish
这样我们就能够实现一个简单的线程池了,合理的使用java线程池能够降低资源消耗,因此掌握java线程池很有必要!最后大家如果想要了解更多java入门知识,敬请关注奇Q工具网。
推荐阅读: