9

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

    }
}

そのような設定は実行可能ですか?スレッドの外側に例外をスローするにはどうすればよいですか?

4

2 に答える 2

9

スレッドの外側に例外をスローするにはどうすればよいですか?

あなたがこれを行うことができるいくつかの方法。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();
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;
     }
 }
于 2012-10-15T13:56:39.343 に答える
2

実行可能なインターフェイスは、チェックされた例外をスローしたり、値を返したりすることはできません。Callableインターフェースでは、値を返すか例外をスローする任意のワーカーメソッドを呼び出すことができます。モニターの主なタスクは次のとおりです。

  1. 呼び出し可能なインスタンスを使用してfutureを宣言および初期化します。

  2. ステートメントを持つことができreturn future.get();、呼び出し元のコードで処理されるように、throws句でチェックされた例外を宣言する必要があるgetResult()メソッド。このようにして、nullを返す必要はありません。

于 2012-10-15T17:40:29.933 に答える