gpt4 book ai didi

java - ExecutorService没有及时终止

转载 作者:行者123 更新时间:2023-12-03 13:03:12 25 4
gpt4 key购买 nike

我有一个ExecutorService运行几个线程。

我要完成的工作是执行,然后等待所有线程终止。为了给您更多背景知识,每个thread1都连接到一个网站。

这是我想出的:

public static void terminateExecutor(ExecutorService taskExecutor) {

taskExecutor.shutdown();
try {
taskExecutor.awaitTermination(2, TimeUnit.SECONDS);
} catch (InterruptedException e) {
System.out.println("Some tasks were interrupted!"); //This gets printed
}
}

现在,很奇怪的是,使用ExecutorService的主线程终止了,但是其中的 thread1没有终止。

我注意到了这一点,因为 thread1抛出了一个错误(此时主线程已经死了),告诉我它找不到指定的URL(所以我想这与连接有关)。
awaitTermination是否有可能因为尝试(并重试)连接到无效链接而没有终止 thread1

我无法以任何其他方式停止 thread1(或者至少就我所知无法停止),因为没有任何循环。

编辑:

我通过创建一个新类并将其提供给执行程序来获得 thread1
for (....)
{

String urlToVisit = globalUrl + links.get(i);
Thread thread1 = new MagicalThread(urlToVisit, 2).getThread();
executor.execute(thread1);

}
terminateExecutor(executor.getExecutor());

最佳答案

执行程序使用中断来让线程知道是时候退出了。如果您的任务正在使用阻塞I/O,则它们将被阻塞并且无法检查中断标志。被阻止的任务无法以 sleep 或等待方式响应中断,中断会导致线程唤醒并抛出InterruptedException。

如果在套接字上设置了超时,则一旦套接字超时,该任务便可以检查中断。您也可以通过关闭套接字使任务响应中断。参见https://www.javaspecialists.eu/archive/Issue056.html

请注意,与链接文章中给出的示例相比,在线程池中实现此操作涉及更多。对于执行程序,除了运行外,其他任何操作都不能让池调用方法执行任务。一种方法是在ThreadLocal中放置对套接字的引用。然后,您可以为该线程创建一个ThreadFactory,以使用一种方法重写Thread的中断方法,以从ThreadLocal获取套接字并关闭该线程,从而将Thread子类化。

关于java - ExecutorService没有及时终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49480296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com