0
//Main.java
public static boolean isEnd() {
    return end;
}
public static void main(String[] args) {

    execProductNumber.execute(new ProductNumber(allBuffer));

    end = true;
    System.out.println("Leaving main");
    //execProductNumber.shutdown();
}

//ProductNumber.java
public void run() {
    while(!Main.isEnd()) {
        //something
    }
    System.out.println("Leaving thread");
}

我正在启动我的程序,得到输出:

Leaving main
Leaving thread

并且程序不会立即终止(我需要等待大约 1.5 分钟才能成功结束程序)。当我试图通过 shutdown() (注释)停止线程时,它立即停止。在尝试调试它时,我发现它延迟了(ThreadPoolExecutor.java):

final void runWorker(Worker w) {
        Thread wt = Thread.currentThread();
        Runnable task = w.firstTask;
        w.firstTask = null;
        w.unlock(); // allow interrupts
        boolean completedAbruptly = true;
        try {
            while (task != null || (task = getTask()) != null) { //here
                w.lock();
                // If pool is stopping, ensure thread is interrupted;
                // if not, ensure thread is not interrupted.  This
                // requires a recheck in second case to deal with
                // shutdownNow race while clearing interrupt

在那里等了一段时间,然后继续前进。为什么?那里会发生什么?那有必要吗?

4

1 回答 1

2

如果execProductNumberExecutorService,那么您需要shutdown()在最后一个作业提交到服务后立即调用。这允许任何已提交的作业完成。

并且程序不会立即终止

正确的。它即将结束,main()但与 关联的线程ExecutorService是非守护程序并且它仍在运行。通过调用execProductNumber.shutdown();,您的应用程序将在ProductNumber任务完成后立即完成。

在尝试调试它时,我发现它延迟了(ThreadPoolExecutor.java):

没错,工作线程正在耐心等待另一个任务提交到线程池。

于 2013-05-09T18:10:50.907 回答