anj*_*esh 3 java multithreading exception-handling threadpool threadpoolexecutor
如果任何提交的线程抛出异常,则不会返回异常。
我想为我的项目编写一段代码,如果任何线程执行失败,它应该在那里抛出异常并且它应该停止所有正在运行和计划的线程。
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
Thread t = new Thread(new MyObject());
executorService.submit(t);
}
Run Code Online (Sandbox Code Playgroud)
我这样写 MyObject ..,
public class MyObject implements Runnable {
public void run() {
throw new NullPointerException("Sample NullPointerException");
}
}
Run Code Online (Sandbox Code Playgroud)
这是我目标的正确实现吗......????我想实现那个目标,请给我一些指示。
提前致谢....!!
这里有一些你可以考虑的事情。这里我使用 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我使用两个类来演示这是有效的。当一个任务抛出异常时,永远运行的任务也会停止运行。
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这有其自身的局限性。这段代码将等待轮到它抛出异常,因为“future.get()”是按顺序执行的。
最好的情况:在第一个 future.get() 中抛出异常,其他任务将被取消。
最坏的情况:在最后的 future.get() 中抛出异常,到时候抛出异常所有其他执行完成的任务。
优化:识别可能引发异常的任务并等待这些任务取消所有其他任务。
如果你的 run 方法有 while ,那么最好的方法是共享一个标志并打破它。检查此答案以获取更多信息。
| 归档时间: |
|
| 查看次数: |
6189 次 |
| 最近记录: |