0

実行可能なスレッドから例外をスローしたいのですが、スレッドから例外をスローすることはできません。そのため、chlildスレッドのステータス(任意の例外)を親スレッドに渡すことができますか?

thread.join()について読みましたが、この場合、親スレッドは子スレッドが実行を終了するまで待機します。

私の場合、親スレッドは一定期間後にスレッドを1つずつ開始しますが、いずれかのスレッドが例外をスローすると、親スレッドが他のスレッドを開始しないように、失敗について患者に通知する必要があります。

それを実装する方法はありますか?誰かが私がこれを解決するのを手伝ってくれる?

4

4 に答える 4

4

@zellerの答えを詳しく説明するには、次のような構成を行うことができます。

//Use a Callable instead of Runnable to be able to throw your exception
Callable<Void> c = new Callable<Void> () {
    public Void call() throws YourException {
        //run your task here which can throw YourException
        return null;
    }
}

//Use an ExecutorService to manage your threads and monitor the futures
ExecutorService executor = Executors.newCachedThreadPool();
List<Future> futures = new ArrayList<Future> ();

//Submit your tasks (equivalent to new Thread(c).start();)
for (int i = 0; i < 5; i++) {
    futures.add(executor.submit(c));
}

//Monitor the future to check if your tasks threw exceptions
for (Future f : futures) {
    try {
        f.get();
    } catch (ExecutionException e) {
        //encountered an exception in your task => stop submitting tasks
    }
}
于 2012-08-30T09:32:36.177 に答える
2

カスタム スレッド プールの代わりにCallable使用することもできます。Callable-sは例外をスローします。 を使用すると、 submitによって返される -sを追跡する実行中のタスクを管理することもできます。このようにして、例外、タスクの完了などを認識できます。<Void>RunnableExecutorServicecall
ExecutorServiceFuture

于 2012-08-30T09:20:29.807 に答える
0

並行コレクションを使用して、親スレッドと子スレッドの間で通信します。runメソッドで、ブロックを実行してすべてtry/catchの例外を受け取り、例外が発生した場合は、親との通信に使用されるコレクションに追加します。親はコレクションをチェックして、エラーが発生したかどうかを確認する必要があります。

于 2012-08-30T09:19:50.133 に答える
0

Runnableインターフェイスを実装する代わりにCallableインターフェイスを実装し、親スレッドに値を返します。

実行可能なスレッドから例外をスローしたいのですが、スレッドからスローすることはできないので、子スレッドのステータス (例外) を親スレッドに渡すことはできますか?

--> @assylias は次のように述べています。戻り値を介して例外を渡すのではなく、単にスローします。次に、通常は future.get(); を使用して、親スレッドからキャッチできます。ExecutionException をスローする呼び出し。

また、Callable.call() throws Exception直接投げることができます。

于 2012-08-30T09:17:41.133 に答える