代码:
public void doSomethingOrThrowUncheckedException()
{
Thread worker = new Thread(new Runnable() {
public void run() {
try {
myObject.doSomething()
} catch(CheckedException e) {
new UncheckedException ();
}
}
});
worker.start();
}
解释
我想在另一个可以抛出已检查异常的线程中执行一些工作。
我不能等待这项工作完成,我希望方法调用者知道这项工作是否出错,因为新线程无法正确处理异常。
我有可以使用的机制吗?
答案 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。