私はマルチスレッドプロジェクトで作業しています。マルチスレッドプロジェクトでは、ロードとパフォーマンスのテストを行っているときに、クライアントコードのエンドツーエンドのパフォーマンスを測定するために複数のスレッドを生成する必要があります。だから私はExecutorService
使用しているコードの下に作成 -ExectuorServiceとThreadPoolExecutor(これはLinkedBlockingQueueを使用しています)
を以下ExecutorService
使用されるコードである -
public class MultithreadingExample {
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(20);
for (int i = 0; i < 100; i++) {
executor.submit(new NewTask());
}
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
}
}
class NewTask implements Runnable {
@Override
public void run() {
//Measure the end to end latency of my client code
}
}
問題文を: -
は、今私は、インターネット上でいくつかの記事を読んでいました。私はそこにあることを知った。
ThreadPoolExecutor
も同様である。だから、私はどちらを使うべきか混乱した。
私は上記のコードfrom-
ExecutorService executor = Executors.newFixedThreadPool(20);
for (int i = 0; i < 100; i++) {
executor.submit(new NewTask());
}
任意の違いを生むだろう、その後
BlockingQueue<Runnable> threadPool = new LinkedBlockingQueue<Runnable>();
ThreadPoolExecutor tpExecutor = new ThreadPoolExecutor(20, 2000, 0L, TimeUnit.MILLISECONDS, threadPool);
tpExecutor.prestartAllCoreThreads();
for (int i = 0; i < 100; i++) {
tpExecutor.execute(new NewTask());
}
ツー・交換した場合は?私はThreadPoolExectuor
を使用して貼り付けたExecutorService
と新しいコードを使用して私の元のコードの違いは何ですか?私のチームメイトの中には、2番目のもの(ThreadPoolExecutor)が正しい方法であると言われていますか?
誰でも私のためにこのことを明確にすることはできますか?助けてくれてありがとう。
あなたは少し利益について話しましたか?それはどういうことですか?そして、ExecutorはThreadPoolExecutorという名前のシーンの背後にいますか?しかし、私はそれは私が推測するわずかに遅い無制限のキューを使用すると思いますか?私が間違っているなら、私を訂正してください。 –
小さな利点は、コンストラクタの引数を使って遊ぶことができますが、これは通常良い考えではありません。あなたは同じ無制限のキューを提供していますので、私はあなたのポイントを見ません。それが遅いなら、なぜデザイナーはそれを使用するでしょうか? –
LinkedBoundedQueueの使用にはコストがかかります。それは無限であるという事実とは無関係であり、あなたがあまり心配していないと思うスレッド間でタスクを渡すコストに比べて非常に小さいです。 –