我怎样才能捕获另一个线程异常

时间:2011-11-10 01:38:40

标签: java multithreading exception exception-handling communication

代码:

public void doSomethingOrThrowUncheckedException()
{

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

解释

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

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

我有可以使用的机制吗?

4 个答案:

答案 0 :(得分:3)

你能在线程外创建一个Observable吗?如果出现问题,线程会设置一个值来更改Observable。主代码是Observer,并在调用属性侦听器时对更改做出反应。

答案 1 :(得分:2)

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

  • 工作线程可以设置错误标志。缺点是调用线程需要检查标志以确定出错的地方。 (也可以有成功的标志;只要两者都没有设置,调用线程就知道工作者仍在工作。

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

答案 2 :(得分:1)

如果,当工作线程成功完成时,它将成功传递给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()成功完成时未与任何内容进行互动,那么您需要遵循其他答案之一。

答案 3 :(得分:0)

您可能还想查看uncaughtExceptionhandler