当面试官问Java线程池时,你应该了解些什么?
发布时间:2021-12-07 15:24:14 所属栏目:教程 来源:互联网
导读:根据江门站长网 Www.0750Zz.Com报道 Java面试中,线程池也算是一个高频的问题,其实就JDK源码来看线程池这一块的实现代码应该算是写的清晰易懂的,通过这篇文章,我们就来盘点一下线程池的知识点。 本文基于JDK1.8源码进行分析 首先看下线程池构造函数: pub
if (t != null) { final ReentrantLock mainLock = this.mainLock; mainLock.lock(); try { //加锁之后仍旧是判断线程池状态等一些校验逻辑。 int rs = runStateOf(ctl.get()); if (rs < SHUTDOWN || (rs == SHUTDOWN && firstTask == null)) { if (t.isAlive()) throw new IllegalThreadStateException(); //把新建的woker线程放入集合保存,这里使用的是HashSet workers.add(w); int s = workers.size(); if (s > largestPoolSize) largestPoolSize = s; workerAdded = true; } } finally { mainLock.unlock(); } if (workerAdded) { //然后启动woker线程 //这里再强调一遍上面说的逻辑,该变量t代表woker线程,也就是会调用woker的run方法 t.start(); workerStarted = true; } } } finally { if (! workerStarted) //如果woker启动失败,则进行一些善后工作,比如说修改当前woker数量等等 addWorkerFailed(w); } return workerStarted; } addWorker方法主要做的工作就是新建一个Woker线程,加入到woker集合中,然后启动该线程,那么接下来的重点就是Woker类的run方法了。 worker执行方法: //Woker类实现了Runnable接口 public void run() { runWorker(this); } //最终woker执行逻辑走到了这里 final void runWorker(Worker w) { Thread wt = Thread.currentThread(); //task就是Woker构造函数入参指定的任务,即用户提交的任务 Runnable task = w.firstTask; w.firstTask = null; w.unlock(); boolean completedAbruptly = true; try { //一般情况下,task都不会为空(特殊情况上面注释中也说明了),因此会直接进入循环体中 //这里getTask方法是要重点说明的,它的实现跟我们构造参数设置存活时间有关 //我们都知道构造参数设置的时间代表了线程池中的线程,即woker线程的存活时间,如果到期则回收woker线程,这个逻辑的实现就在getTask中。 //来不及执行的任务,线程池会放入一个阻塞队列,getTask方法就是去阻塞队列中取任务,用户设置的存活时间,就是 //从这个阻塞队列中取任务等待的最大时间,如果getTask返回null,意思就是woker等待了指定时间仍然没有 //取到任务,此时就会跳过循环体,进入woker线程的销毁逻辑。 while (task != null || (task = getTask()) != null) { w.lock(); if ((runStateAtLeast(ctl.get(), STOP) || (Thread.interrupted() && runStateAtLeast(ctl.get(), STOP))) && !wt.isInterrupted()) wt.interrupt(); try { //该方法是个空的实现,如果有需要用户可以自己继承该类进行实现 beforeExecute(wt, task); (编辑:宿州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐