【问题标题】:How can i catch another threads exception我怎样才能捕获另一个线程异常
【发布时间】:2011-11-10 01:38:40
【问题描述】:

代码:

public void doSomethingOrThrowUncheckedException()
{

    Thread worker = new Thread(new Runnable() {
            public void run() {
                try {
                    myObject.doSomething()
                } catch(CheckedException e) {
                    new UncheckedException ();
                }
            }
        });
    worker.start();
}

说明

我想在另一个可以抛出检查异常的线程中执行一些工作。

我不能等待这项工作完成,我希望方法调用者知道这项工作是否有问题,因为新线程无法正确处理异常。

有没有我可以使用的机制?

【问题讨论】:

    标签: java multithreading exception exception-handling communication


    【解决方案1】:

    你能在线程之外创建一个 Observable 吗?如果出现问题,线程会设置一个值来更改该 Observable。主要代码是一个观察者,当属性监听器被调用时对变化做出反应。

    【讨论】:

      【解决方案2】:

      这取决于调用者知道出现问题的意思。立即想到几个选项。

      • 工作线程可以设置错误标志。缺点是调用线程需要检查标志才能知道出了什么问题。 (也可以有一个成功的标志;只要两者都没有设置,调用线程就知道工人仍在工作。

      • 工作线程可以调用错误方法。缺点是调用会发生在工作线程中。另一方面,这为采取积极行动提供了场所。观察者模式在这里可能有用(尽管我认为 Java 的实现很糟糕)。

      【讨论】:

      • 我只是好奇为什么Java的观察者模式的实现很糟糕?
      • @gigadot - 首先,Observable 是一个类,所以如果你的类需要继承 Object 以外的东西,你不能也让它成为 Observable。其次,Observer 接口起源于前通用 Java,因此回调数据是一个对象,必须转换为您真正需要的任何类,无需编译时类型检查。
      • 谢谢。我不知道 Observable 是 Java API 的一部分。我会在不扩展 Observable 类的情况下做到这一点。观察者模式只是一个编程设计概念,所以我不明白为什么它必须成为标准 API 的一部分。现在我完全同意你的看法。
      【解决方案3】:

      如果,当工作线程成功完成时,它会将成功传达给 Foo,或者生成 Foo 使用的对象,然后扩展该机制以允许它将检查的异常传递给 Foo,而不是将异常传递给方法调用线程。

      public void doSomething()
      {
          Thread worker = new Thread(new Runnable() {
                  public void run() {
                      try {
                          result = myObject.doSomething();
                          foo.processResult(result);
                      } catch(CheckedException e) {
                          foo.processException(e);
                      }
                  }
              });
          worker.start();
      }
      
      public void doSomething()
      {
      
          Thread worker = new Thread(new Runnable() {
                  public void run() {
                      try {
                          result = myObject.doSomething();
                          resultQueue.add(result);
                      } catch(CheckedException e) {
                          resultQueue.add(e);
                      }
                  }
              });
          worker.start();
      }
      

      如果doSomething() 在成功完成后没有与任何东西交互,那么您需要遵循其他答案之一。

      【讨论】:

      • 不幸的是它不与任何东西交互!但是阅读你的代码给了我一些解决其他问题的好主意,所以谢谢! (+1)
      【解决方案4】:

      您可能还想看看uncaughtExceptionhandler

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        • 2021-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多