【发布时间】:2018-03-25 19:55:46
【问题描述】:
我有一个运行几个线程的 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 的主线程终止了,但其中的 thread1s 没有。
我注意到这一点是因为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());
【问题讨论】:
-
1)
thread1在哪里? 2) 为什么要打印中断消息? 3) 我敢打赌你会发现awaitTermination's return value 告诉你一些相关的事情。 -
@AndyTurner thread1 从字面上连接到一个网站,如果抛出错误,它会打印“嘿,这个链接......不起作用!”。中断消息不应该被打印出来,以为有人可能会问它是否被打印,所以我添加了评论。
-
请说明您如何获得“
thread1”:您无法直接访问由ExecutorService运行Runnable的线程。也许你将它声明为Thread,但它实际上被用作Runnable,它是Thread的事实并不相关,因为它运行在ExecutorService的一个内部线程上。跨度> -
...
MagicalThread是如何声明的?如果你可以调用executor.executor()(看起来像ExecutorService),但调用terminateExecutor(executor.getExecutor())(看起来像有ExecutorService),那么executor是什么。 -
@AndyTurner 好的,
MagicalThread实现了可运行,并且不是线程。我很快改变了它,尽管它仍然没有停止。是的,executor 是我创建的一个类,它使用 ExecutorService 来做他的事情。
标签: java multithreading