呼び出し可能と未来でスレッドプールの実装の結果を受信するには

Javaスレッドの実行では、それが直接の後継スレッド方法、または、Runnableインタフェースを達成するための方法であるかどうか、結果は実行のスレッドに戻って取得することはできません。このスレッドの実行中にエラーが発生した場合は、メインスレッドは、知覚されることはありません。印刷ログはすぐにスローされることができない場合であっても。その後、バグがあった発見するためにログを表示します。そして、問題を指すようにコードは非常に異なる可能性があります本当の問題から発生しました。タイムリーにスローされたスレッドプールの実行プロセスにバグがある場合、これは良い実装でしょう。この問題を解決するには、将来のgetメソッドで行うことを、結果を得るためにスレッドを返すことができます呼び出し可能インターフェースを使用することです。1000年のスレッドで実現累積次の例では、呼び出し可能と未来の使用を実証するために:

パッケージcom.hys.test。

輸入java.util.concurrent.CountDownLatch。
輸入java.util.concurrent.ExecutionException。
輸入java.util.concurrent.ExecutorService。
輸入java.util.concurrent.Future。
輸入java.util.concurrent.LinkedBlockingQueue。
輸入java.util.concurrent.ThreadFactory。
輸入java.util.concurrent.ThreadPoolExecutor。
輸入java.util.concurrent.TimeUnit。
輸入java.util.concurrent.atomic.AtomicInteger。

輸入com.google.common.util.concurrent.ThreadFactoryBuilder。

パブリッククラスTest {

プライベート静的のAtomicIntegerのNUM =新規のAtomicInteger()。

公共の静的な無効メイン(文字列[]引数)はInterruptedExceptionある、ExecutionExceptionを{スロー
たCountDownLatchラッチ=新たCountDownLatch(1000);
ThreadFactory namedThreadFactory =新しいThreadFactoryBuilder()setNameFormat( "増分-プール- %d個")の構築()。。。
ExecutorServiceのpoolexecutor =て、新しいThreadPoolExecutor(1000,1000、0L、TimeUnit.MILLISECONDS、新しいLinkedBlockingQueue <Runnableを>(1024)、namedThreadFactory、新しいThreadPoolExecutor.AbortPolicy())。
将来の<文字列> = NULLを提出します。
{(;;私は1000年の<I ++が、私は0 = INT)のため
であれば(提出= NULL && submit.get()!= NULL!){
latch.countDown();
持続する;
}
= poolexecutor.submitを提出(() - > {
試みる{
//这里模拟一个耗时很长的操作
num.getAndIncrement();
// INT A = 1/0;
のThread.sleep(1);
戻りヌル。
キャッチ}(例外E){
(e.toStringを返す);
} {最後に
latch.countDown();
}
});
}
poolexecutor.shutdown(http://www.amjmh.com/v/);
//メインスレッドすべてのサブスレッドの実行を待つが前に完了し、実行
()latch.await;
文字列errorMsg内容= submit.get();
//子スレッドの実行時にエラーが、これが投げた場合
ならば(!errorMsg内容=ヌル) {
のRuntimeException新しい新しい(errorMsg内容)を投げる;
}
のSystem.out.println(NUM);
}
}
各スレッドは何の問題は、実行中に発生しない場合、返される結果がヌルです。リターン結果がnullでない場合、コードは問題がある実行スレッドを表し、エラー・メッセージが返されます。再度実行される、以下の結果が得られる算術例外コードをシミュレートするために、上述したリリースコードライン33に注意してください。

スレッドの例外"メイン" java.lang.RuntimeException:java.lang.ArithmeticException:/ゼロによる
com.hys.test.Test.main(Test.java:49)で
------------ --------- 

おすすめ

転載: www.cnblogs.com/liyanyan665/p/11332649.html