Java 如何捕获另一个线程异常

Java 如何捕获另一个线程异常,java,multithreading,exception,exception-handling,communication,Java,Multithreading,Exception,Exception Handling,Communication,代码: public void doSomethingOrThrowUncheckedException() { Thread worker = new Thread(new Runnable() { public void run() { try { myObject.doSomething() } catch(CheckedException e) {

代码:

public void doSomethingOrThrowUncheckedException()
{

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

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

我不能等待这项工作完成,我想让方法调用方知道这项工作是否出了问题,因为新线程无法正确处理异常


有一种机制我可以使用吗?

你能在线程外部创建一个可观察的机制吗?如果出现问题,线程将设置一个值来更改该可观察值。主代码是一个观察者,在调用属性侦听器时对更改作出反应。

您能在线程外部创建一个可观察的吗?如果出现问题,线程将设置一个值来更改该可观察值。主代码是一个观察者,在调用属性侦听器时会对更改作出反应。

这取决于调用方知道发生了什么错误时的意思。我马上想到了几个选择

  • 工作线程可以设置错误标志。缺点是调用线程将需要检查标志以知道出现了错误。(也可以有一个成功标志;只要两个都没有设置,调用线程就知道辅助线程仍在工作

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


这取决于你所说的来电者知道出了问题是什么意思。我马上想到了几个选项

  • 工作线程可以设置一个错误标志。缺点是调用线程需要检查标志以知道出现了错误。(也可以有一个成功标志;只要没有设置,调用线程就知道工作线程仍在工作。)

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


您可能还想看一看。

您可能还想看一看。

如果当工作线程成功完成时,它将成功传递给Foo,或生成Foo使用的对象,则扩展该机制以允许它将选中的异常传递给Foo,而不是将异常传递给me方法调用线程

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()
成功完成时不与任何对象交互,那么您需要遵循其他答案之一。

如果工作线程成功完成时将成功传递给Foo,或者生成Foo使用的对象,则扩展该机制以允许它将选中的异常传递给Foo,而不是n将异常传递给调用线程的方法

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()
成功完成后不会与任何东西交互,那么您需要遵循其他答案之一。

我只是好奇为什么Java对Observer模式的实现很糟糕?@gigadot-首先,Observable是一个类,所以如果您的类需要对Object之外的某个对象进行子类化,那么您也不能将其设置为Observable。其次,tObservable接口可以追溯到前泛型Java,因此回调数据是一个对象,必须转换到您真正需要的任何类,而无需编译时类型检查。谢谢。我不知道Observable是Java API的一部分。我不会扩展Observable类。Observable模式只是一个编程设计概念,所以我我不明白为什么这必须成为标准API的一部分。现在我完全同意你的观点。我只是好奇为什么Java对Observer模式的实现很糟糕?@gigadot-首先,Observable是一个类,所以如果你的类需要对Object之外的东西进行子类化,你就不能将它也设置为Observable。其次,Observer接口日期从前泛型Java,因此回调数据是一个对象,必须强制转换到您真正需要的任何类,而无需编译时类型检查。谢谢。我不知道Observable是Java API的一部分。我不会扩展Observable类。Observable模式只是一个编程设计概念,所以我不明白为什么会这样必须是标准API的一部分。现在我完全同意你的看法。不幸的是,它与任何东西都不交互!但是阅读你的代码给了我一些解决其他问题的好主意,所以谢谢!(+1)不幸的是,它不能与任何东西交互!但是阅读您的代码给了我一些解决其他问题的好主意,所以谢谢!(+1)