2

メイン クラスから複数のタスクを実行します。

ExecutorService executor = Executors.newFixedThreadPool(N);
    for (int i = 0; i < M; i++) {
    executor.execute(task);
}

executor .shutdown(); 
while (!executor.isTerminated()){} //block                          

task はimplements Runnable.

メソッドではrun()、チェック済みの例外を使用していくつかの API を呼び出します。つまり、呼び出しを try-catch ブロックで囲む必要があります。
そのため、メイン クラスが例外がスローされたことを知る方法はありません。

どうすればこれを解決できますか?

4

5 に答える 5

3

代わりに Callable を使用できます。

Callable<?> task = new Callable<Void> () {
    public Void call() throws Exception {
        someCodeThatThrowsCheckedExceptions();
        return null;
    }
}

それで:

Future<?> f = executor.submit(task);
try {
    f.get();
} catch (ExecutionException e) {
    System.out.println("task threw exception: " + e.getCause().getMessage());
}
于 2013-06-06T09:04:56.930 に答える
0

主な例外からUncheckedExceptionを作成できます。UncheckedExceptionを拡張する独自のクラスを作成RuntimeExceptionし、必要なすべてのコンストラクターを定義したと仮定します。あなたは言うことができます、

    @Override
    public void run() {
        try {
            //some code that throws checked exception
        }
        catch(Exception e) {
            throw new UncheckedException(e);
        }
    }

throwsここで宣言する必要がないため、このコードはコンパイルされます

于 2013-06-06T08:56:55.517 に答える
0

タスクを実装するように変更できる場合はCallable、call() からチェック例外をスローできます。タスクは値を返さないため、使用します。Callable<Void>

class Task implements Callable<Void> {
    public Void call throws YourAPIException {
        //code that throws a checked exception
        return null;
    }
}

Callable<?>とは異なりRunnable、チェック例外をスローして結果を返すことができます。

のメソッド シグネチャによりcall()、チェック済み例外をスローできます

V call() throws Exception
于 2013-06-06T09:07:59.330 に答える
0

常に例外を再スローして、呼び出し元にそれを知らせます。そうしないと、例外がエスケープされる可能性があります。本 Java Concurrency in Practice で適切な説明を見つけることができます。申し訳ありませんが、コメントとして記載する必要がありますが、私のスコアでは許可されていません:)

于 2013-06-06T08:53:07.803 に答える