java - 线程中的异常

标签 java multithreading

我做了一个多线程程序。其中,主线程启动了 10 个线程,但问题是每当其中一个线程发生异常时,整个应用程序就会停止。

  1. 但我希望每当一个线程中发生异常时,只有该线程应该停止,而其他线程继续工作。我怎样才能做到这一点?

  2. 其次,我希望主线程仅在所有 10 个线程完成后才停止。我怎样才能做到这一点?

最佳答案

您可以使用 ExecutorService (包含多个线程)通过调用submit() 来处理您的各个工作项。提交方法返回一个 Future,它将封装处理结果或抛出的任何异常。换句话说,您的 ExecutorService 中的线程如果发生异常,不会终止。

示例

首先创建一个包含多个线程的执行器服务:

ExecutorService execService = Executors.newFixedThreadPool(5);

将我们希望提交的工作项目定义为 Callable :

public class MyWorkItem implements Callable<Integer> {
  public Integer call() throws Exception {
    int result = new Random().nextInt(5);

    // Randomly fail.
    if (result == 0) {
      throw new IllegalArgumentException("Fail!");
    }

    return result;
  }
}

提交一些工作给执行器服务去做,并存储Future<Integer>对于每个 Callable<Integer> .

List<Future<Integer>> futures = new LinkedList<Future<Integer>>();

for (int i=0; i<10; ++i) {
  futures.add(execService.submit(new MyWorkItem()));
}

现在迭代 future,尝试检索每个工作项的结果(我们可以为此使用 CompletionService)。

for (Future<Integer> future : futures) {
  try {
    Integer result = future.get();
  } catch(Exception ex) {
    // Handle exception.
  }
}

关于java - 线程中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1596037/

相关文章:

Java ExecutorService 解决递归斐波那契数列

c# - 锁定字段或局部变量?

java - 如何将复杂的 Java 对象写入 CSV 文件

ios - Realm 线程困惑

java - 如何在 slider 移动时而不只是在松开鼠标时调用 Action 监听器?

java - Sonar 问题 : Classes and methods that rely on the default system encoding should not be used

multithreading - 使用内存sqlite数据库时,QSqlQuery是否有线程锁

python:在 map 函数中产生

java - 如果不使用 <form> 声明,则使用 jquery 获取 Radio 值不起作用

java - 在长 Scala 列表或 Stream 上进行 reduce() 操作期间,Java JVM 关于 GC 的智能程度如何?