How do I throw exception to the outside of the thread?
夫妻俩可以做到这一点.您可以在线程上设置UncaughtExceptionHandler,也可以使用ExecutorService.submit(Callable)并使用从Future.get()获得的异常.
最简单的方法是使用ExecutorService:
ExecutorService threadPool = Executors.newSingleThreadScheduledExecutor();
Future future = threadPool.submit(new Callable() {
public Void call() throws Exception {
// can throw OhNoException here
return null;
}
});
// you need to shut down the pool after submitting the last task
threadPool.shutdown();
// this can throw ExecutionException
try {
// this waits for your background task to finish,it throws if the task threw
future.get();
} catch (ExecutionException e) {
// this is the exception thrown by the call() which could be a OhNoException
Throwable cause = e.getCause();
if (cause instanceof OhNoException) {
throw (OhNoException)cause;
} else if (cause instanceof RuntimeException) {
throw (RuntimeException)cause;
}
}
如果您想使用UncaughtExceptionHandler,那么您可以执行以下操作:
Thread thread = new Thread(...);
final AtomicReference throwableReference = new AtomicReference();
thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
public void uncaughtException(Thread t,Throwable e) {
throwableReference.set(e);
}
});
thread.start();
thread.join();
Throwable throwable = throwableReference.get();
if (throwable != null) {
if (throwable instanceof OhNoException) {
throw (OhNoException)throwable;
} else if (throwable instanceof RuntimeException) {
throw (RuntimeException)throwable;
}
}