场景:我有一些有限的独立任务,这些任务将被提供给几个线程来完成这些任务。主线程应等待所有线程完成其任务。虽然它在大多数情况下都有效,但有时其中一个线程无法完成其任务,因此主线程无限期地等待。如何杀死被阻止的线程?
以下是解释该方案的示例代码。
客户等级
public class ThreadStop {
public static void main(String[] args){
List<Thread> threadList = getMyThreadList();
for (Thread thread : threadList) {
thread.start();
}
System.out.println("Waiting for Child Threads to die");
for (Thread thread : threadList) {
try {
thread.join();
System.out.println(thread.getName() + " Finished its job");
} catch (InterruptedException e) {
System.out.println("Interrupted Exception thrown by : "
+ thread.getName());
}
}
System.out.println("All Child Threads Finished their Job");
}
private static List<Thread> getMyThreadList() {
List<Thread> threadList = new ArrayList<>();
MyThread myThread;
Thread thread;
for(int i=0; i<10; i++){
myThread = new MyThread();
thread = new Thread(myThread);
thread.setName("Thread "+i);
threadList.add(thread);
}
return threadList;
}
}
主题类
public class MyThread implements Runnable{
@Override
public void run() {
System.out.println("hello world by thread "+ Thread.currentThread().getName());
}
}
注意请注意,我不能使用执行器框架。
答案 0 :(得分:0)
如果任务直接显式写为子类Thread
,那么使用Executor框架就是[1]。在这种情况下,您应该使用具有超时值的join()
。如果加入不成功,您可以interrupt()
该帖子(但这不是保证&#39; kill&#39;)。直接戳线并不是一种很好的做事方式 - 它就像一场你总是输球的比赛,唯一的胜利就是不打比赛。
然而,如果任务写得更加明智/有利于现代见解,那么它们至少可以包含Runnable
(或者实际上,它们是Runnable
并且只是传递给Thread
)的构造函数。此时,您可以再次使用Executor框架。
start()
或run()
线程(因为如果其他代码也执行相同的任务,然后在最佳情况下执行两次任务。)