加入收藏 | 设为首页 | 会员中心 | 我要投稿 宿州站长网 (https://www.0557zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

当面试官问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);

(编辑:宿州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章