看到一个魔改线程池,面试素材加一!

你好呀,我是歪歪。

今天给大家分享一个经过扩展后的线程池,且我觉得扩展的思路非常好的。

放心,我标题党来着,我觉得面试不会有人考这个玩意,但是工作中是有可能真的会遇到相应的场景。

为了引出这个线程池,我先给大家搞个场景,方便理解。

就拿下面这个表情包来做例子吧。

看到一个魔改线程池,面试素材加一!

假设我们有两个程序员,就叫富贵和旺财吧。

上面这个表情包就是这两个程序员一天的工作写照,用程序来表示是这样的。

首先我们搞一个对象,表示程序员当时正在做的事儿:

public class CoderDoSomeThing {

    private String name;
    private String doSomeThing;

    public CoderDoSomeThing(String name, String doSomeThing) {
        this.name = name;
        this.doSomeThing = doSomeThing;
    }
}

然后,用代码描述一下富贵和旺财做的事儿:

public class NbThreadPoolTest {

    public static void main(String[] args) {
        CoderDoSomeThing rich1 = new CoderDoSomeThing("富贵""启动Idea");
        CoderDoSomeThing rich2 = new CoderDoSomeThing("富贵""搞数据库,连tomcat,crud一顿输出");
        CoderDoSomeThing rich3 = new CoderDoSomeThing("富贵""嘴角疯狂上扬");
        CoderDoSomeThing rich4 = new CoderDoSomeThing("富贵""接口访问报错");
        CoderDoSomeThing rich5 = new CoderDoSomeThing("富贵""心态崩了,卸载Idea");

        CoderDoSomeThing www1 = new CoderDoSomeThing("旺财""启动Idea");
        CoderDoSomeThing www2 = new CoderDoSomeThing("旺财""搞数据库,连tomcat,crud一顿输出");
        CoderDoSomeThing www3 = new CoderDoSomeThing("旺财""嘴角疯狂上扬");
        CoderDoSomeThing www4 = new CoderDoSomeThing("旺财""接口访问报错");
        CoderDoSomeThing www5 = new CoderDoSomeThing("旺财""心态崩了,卸载Idea");
    }
}

简单解释一下变量的名称,表明我还是经过深思熟虑了的。

富贵,就是有钱,所以变量名叫做 rich。

旺财,就是汪汪汪,所以变量名叫做 www。

你看我这个类的名称,NbThreadPoolTest,就知道我是要用到线程池了。

实际情况中,富贵和旺财两个人是可以各干各的事儿,互不干扰的,也就是他们应该是各自的线程。

各干各的事儿,互不干扰,这听起来好像是可以用线程池的。

所以,我把程序修改成了下面这个样子,把线程池用起来:

public class NbThreadPoolTest {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(5);

        List<CoderDoSomeThing> coderDoSomeThingList = new ArrayList<>();

        coderDoSomeThingList.add(new CoderDoSomeThing("富贵""启动Idea"));
        coderDoSomeThingList.add(new CoderDoSomeThing("富贵""搞数据库,连tomcat,crud一顿输出"));
        coderDoSomeThingList.add(new CoderDoSomeThing("富贵""嘴角疯狂上扬"));
        coderDoSomeThingList.add(new CoderDoSomeThing("富贵""接口访问报错"));
        coderDoSomeThingList.add(new CoderDoSomeThing("富贵""心态崩了,卸载Idea"));

        coderDoSomeThingList.add(new CoderDoSomeThing("旺财""启动Idea"));
        coderDoSomeThingList.add(new CoderDoSomeThing("旺财""搞数据库,连tomcat,crud一顿输出"));
        coderDoSomeThingList.add(new CoderDoSomeThing("旺财""嘴角疯狂上扬"));
        coderDoSomeThingList.add(new CoderDoSomeThing("旺财""接口访问报错"));
        coderDoSomeThingList.add(new CoderDoSomeThing("旺财""心态崩了,卸载Idea"));

        coderDoSomeThingList.forEach(coderDoSomeThing -> {
            executorService.execute(() -> {
                System.out.println(coderDoSomeThing.toString());
            });
        });
    }
}

上面程序就是把富贵和旺财两人做的事情都封装到了 list 里面,然后遍历这个 list 把里面的东西,即“做的事情”都扔到线程池里面去。

那么上面的程序执行后,一种可能的输出是这样的:

看到一个魔改线程池,面试素材加一!

乍一看没问题,富贵和旺财都在同时做事。

但是仔细一看,每个人做的事情的顺序不对了啊。

比如旺财看起来有点“精神分裂”,刚刚启动 Idea,嘴角就开始疯狂上扬了。

所以,到这里可以引出我想要的东西了。

我想要的是什么样的东西呢?

就是在保证富贵和旺财在同时做事的情况下,还要保证他们的做的事情是有一定顺序的,即按照我投放到线程池里面的顺序来执行。

用正式一点的话来描述是这样的:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwfzjd.html