我有一个Controller类和一个Monitor工作线程.
控制器线程看起来像这样
控制器线程看起来像这样
public class ControllerA { public void ControllerA(){ try{ doWork(); } catch(OhNoException e){ //catch exception } public void doWork() throws OhNoException{ new Thread(new Runnable(){ public void run(){ //Needs to monitor resources of ControllerA,//if things go wrong,it needs to throw OhNoException for its parent } }).start(); //do work here } }
这样的设置是否可行?如何将异常抛出到线程外部?
解决方法
How do I throw exception to the outside of the thread?
夫妻俩可以做到这一点.您可以在线程上设置UncaughtExceptionHandler,也可以使用ExecutorService.submit(Callable)并使用从Future.get()获得的异常.
最简单的方法是使用ExecutorService:
ExecutorService threadPool = Executors.newSingleThreadScheduledExecutor(); Future<Void> future = threadPool.submit(new Callable<Void>() { 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<Throwable>(); 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; } }