【问题标题】:Java multithreading errors handlingJava多线程错误处理
【发布时间】:2013-08-16 00:19:22
【问题描述】:

我有一个主线程,它创建了许多工人,每个工人都是一个线程。

如果某些工作人员出现异常或工作人员无法成功结束,我如何从主线程中的工作人员那里获取错误?

如何在工作线程死亡前发送错误?

【问题讨论】:

标签: java multithreading error-handling


【解决方案1】:

使用ExecutorService 或ThreadPoolExecutor

您可以通过三种方式捕获异常

  1. Future.get()
  2. 将整个 run() or call() 方法包装在 try{}catch{}Exceptoion{} 块中
  3. 覆盖ThreadPoolExecutor的afterExecute方法

请参阅下面的 SE 问题了解更多详情:

Handling Exceptions for ThreadPoolExecutor

【讨论】:

    【解决方案2】:

    实现此目的的一种方法是使用线程中的信号传递。当您需要线程之间进行通信时,信号传递被广泛使用。实现这一点的简单方法是访问线程之间的共享对象并监视对象的值(信号指示)。 您可以为指示失败的对象分配一些值(以信号的形式),以便其他线程可以采取适当的行动。
    使用信号,您不仅可以传递失败信号,还可以传递各种其他状态信号,方法是为共享对象设置适当的值(比如 Enum 具有不同的值来指示线程的状态)。
    更多详情请参考此链接:http://tutorials.jenkov.com/java-concurrency/thread-signaling.html

    【讨论】:

      【解决方案3】:

      如果您使用 java.util.concurrent Executor 框架并从每个提交的 worker 生成一个 Future,那么在 Future 上调用 get() 将给您该 worker 的结果,或者该 worker 中抛出/捕获的异常。

      【讨论】:

        【解决方案4】:

        您可以设置全局UncaughtExceptionHandler,它将拦截所有线程中的所有未捕获异常

        Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                ...
            }
        });
        

        【讨论】:

          猜你喜欢
          • 2017-02-07
          • 2020-01-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多