java – 嵌套线程可以为父线程抛出异常吗?
发布时间:2020-12-15 01:01:58 所属栏目:Java 来源:网络整理
导读:我有一个Controller类和一个Monitor工作线程. 控制器线程看起来像这样 public class ControllerA { public void ControllerA(){ try{ doWork(); } catch(OhNoException e){ //catch exception } public void doWork() throws OhNoException{ new Thread(new
我有一个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 } } 这样的设置是否可行?如何将异常抛出到线程外部? 解决方法
夫妻俩可以做到这一点.您可以在线程上设置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; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读