当前位置: 代码迷 >> J2SE >> 问个多线程Executors的小疑点
  详细解决方案

问个多线程Executors的小疑点

热度:101   发布时间:2016-04-24 02:17:35.0
问个多线程Executors的小问题
我在做Thinking In Java第四版最后一章第三个练习

我写的是:
Java code
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Ex3{    public static void main(String[] args)    {                System.out.println("------Cached Pool------");        ExecutorService execCached = Executors.newCachedThreadPool();        execCached.execute(new Imex31());        execCached.execute(new Imex32());        execCached.execute(new Imex33());        execCached.shutdown();                System.out.println("------Fixed Pool------");        ExecutorService execFixed = Executors.newFixedThreadPool(3);        execFixed.execute(new Imex31());        execFixed.execute(new Imex32());        execFixed.execute(new Imex33());        execFixed.shutdown();                System.out.println("------Single Thread------");        ExecutorService execSingle = Executors.newSingleThreadExecutor();        execSingle.execute(new Imex31());        execSingle.execute(new Imex32());        execSingle.execute(new Imex33());        execSingle.shutdown();                /*Thread t1 = new Thread(new Imex31());        Thread t2 = new Thread(new Imex32());        Thread t3 = new Thread(new Imex33());                t1.start();        t2.start();        t3.start();*/    }}class Imex31 implements Runnable{    public Imex31()    {        System.out.println("Constructor 1 begin");    }    public void run()    {        for (int i = 1; i < 4; i++)        {            System.out.println("In the run ex1 " + i);            Thread.yield();        }        System.out.println("ex1 complete");        return;    }}class Imex32 implements Runnable{    public Imex32()    {        System.out.println("Constructor 2 begin");    }    public void run()    {        for (int i = 1; i < 4; i++)        {            System.out.println("In the run ex2 " + i);            Thread.yield();        }        System.out.println("ex2 complete");        return;    }}class Imex33 implements Runnable{    public Imex33()    {        System.out.println("Constructor 3 begin");    }    public void run()    {        for (int i = 1; i < 4; i++)        {            System.out.println("In the run ex3 " + i);            Thread.yield();        }        System.out.println("ex3 complete");        return;    }}


奇怪的是输出显示execFixed那几个线程没有shutdown就开始execSingle了,这是怎么回事呢?

谢谢先!!

------解决方案--------------------
你三个线程池之间并没有什么关系,三个线程池 每个分别处理三个不同的任务。

你的主线程是 main 方法 ,

ExecutorService execCached = Executors.newCachedThreadPool();
execCached.execute(new Imex31());
execCached.execute(new Imex32());
execCached.execute(new Imex33());
execCached.shutdown();

System.out.println("------Fixed Pool------");
ExecutorService execFixed = Executors.newFixedThreadPool(3);
execFixed.execute(new Imex31());
execFixed.execute(new Imex32());
execFixed.execute(new Imex33());
execFixed.shutdown();

System.out.println("------Single Thread------");
ExecutorService execSingle = Executors.newSingleThreadExecutor();
execSingle.execute(new Imex31());
execSingle.execute(new Imex32());
execSingle.execute(new Imex33());
execSingle.shutdown();

你在线程池上调用 shuntdown 是告诉线程池 ,在任务完成的时候结束线程而已。
再说 在线程池上面 shutdown 线程又不会阻塞, 那么后面的语句当然可以执行了啊。
你可以 在每个线程池开始后 也就是在 shutdown 后面加上 一句 TimeUnit.Second.sleep(5); 睡几秒过后等你线程池的任务任务执行完毕后在开始下一个线程池。


建议在把线程池 的API 仔细看看吧。

楼上说的家 synchronized 那是肯定都不对的。 因为根本不涉及到任何同步。