加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

    }
}

这样的设置是否可行?如何将异常抛出到线程外部?

解决方法

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;
     }
 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读