gpt4 book ai didi

java - 当一个线程失败时停止 ExecutorService 线程。 & 返回异常

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:43:45 27 4
gpt4 key购买 nike

如果任何提交的线程抛出异常,它不会返回异常。

我想为我的项目编写一段代码,如果任何线程执行失败,它应该在那里抛出异常并且它应该停止所有正在运行和计划的线程。

ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
Thread t = new Thread(new MyObject());
executorService.submit(t);
}

我这样写 MyObject..,

public class MyObject implements Runnable {   
public void run() {
throw new NullPointerException("Sample NullPointerException");
}
}

这对我的目标来说是正确的实现吗...?????我想实现那个目标,请给我一些指示。

提前致谢....!!

最佳答案

这是您可以考虑的事情。这里我使用 CallableTask 而不是 Thread。

    public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(10);
Set<Future<Void>> futureSet = new HashSet<Future<Void>>();

for (int i = 0; i < 9; i++) {
CallableTask1 task = new CallableTask1();
futureSet.add(executorService.submit(task));
}

CallableTask2 task2 = new CallableTask2();
futureSet.add(executorService.submit(task2));

boolean flag = false;
for (Future<Void> future : futureSet ) {
try {
future.get();
} catch (InterruptedException e) {
System.out.println("Interrupted");
} catch (ExecutionException e) {
System.out.println("Exception thrown from the thread");
flag = true;
break;
}
}

if(flag) {
for (Future<Void> future : futureSet) {
future.cancel(true);
}
}
}

我在这里使用两个类来演示这是有效的。当一个任务抛出异常时,永远运行的任务也会停止运行。

class CallableTask1 implements Callable<Void> {

@Override
public Void call() throws Exception {
throw new NullPointerException("Sample NullPointerException");
}
}


class CallableTask2 implements Callable<Void> {

@Override
public Void call() throws Exception {
while (true){
System.out.println("THIS IS RUNNING");
Thread.sleep(5000);

}
}
}

但这有其自身的局限性。此代码将等待轮到它抛出异常,因为“future.get()”是按顺序执行的。

最佳情况:在第一个 future.get() 中抛出异常,其他任务将被取消。

最坏的情况:在最后一个 future.get() 中抛出一个异常,到那时抛出一个异常,所有其他任务都已完成。

优化:确定可以抛出异常的任务并等待这些任务取消所有其他任务。

如果您的运行方法中包含 while,那么最好共享一个标志并在其上中断。检查this回答更多信息。

关于java - 当一个线程失败时停止 ExecutorService 线程。 & 返回异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30112213/

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