我做了一个多线程程序。其中,主线程启动了 10 个线程,但问题是每当其中一个线程发生异常时,整个应用程序就会停止。
但我希望每当一个线程中发生异常时,只有该线程应该停止,而其他线程继续工作。我怎样才能做到这一点?
其次,我希望主线程仅在所有 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/