首页 > 解决方案 > 固定线程池立即退出,不处理线程

问题描述

为了理解固定线程池,我编写了这个测试代码,它显示了以下结果,与我认为的相反:

Thread Start: 1
Thread Start: 2
Thread Start: 0

而已。没有“线程结束”消息,只启动了 3 个线程。

我期望并且我希望完成所有 10 项任务。

ExecutorService exec = Executors.newFixedThreadPool(3);

for (int c = 0; c < 10; c++) {
    exec.execute(new TestThread(c));
}
exec.shutdown();

public class TestThread implements Runnable {

    private int counter;

    public TestThread (int counter) {
        this.counter = counter;
    }

    @Override
    public void run() {
        System.out.println("Thread Start: " + counter);

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Thread End: " + counter);
    }
}

标签: javamultithreadingjava-threads

解决方案


exec.shutdown()不会阻塞主线程。如果您需要等待所有提交的任务完成,您需要exec.awaitTermination(1, TimeUnit.HOUR);在调用exec.shutdown();.

/**
 * Blocks until all tasks have completed execution after a shutdown
 * request, or the timeout occurs, or the current thread is
 * interrupted, whichever happens first.
 */
boolean awaitTermination(long timeout, TimeUnit unit)
    throws InterruptedException;

推荐阅读