ホームページ  >  記事  >  「Executor Service」Java でマルチスレッドを処理する方法

「Executor Service」Java でマルチスレッドを処理する方法

WBOY
WBOY転載
2024-02-22 12:43:06601ブラウズ

php エディター Youzi が答えを与えます: Executor Service を使用して Java でマルチスレッドを処理することは、スレッド プールとスレッドのライフ サイクルを効果的に管理する効率的な方法です。 Executor Service を使用すると、複数のスレッドを簡単に作成、開始、制御して、タスクの同時実行を実現し、プログラムの効率を向上させることができます。この記事では、Executor Service を使用して Java でマルチスレッドの問題を処理する方法について詳しく説明し、この重要なマルチスレッド処理ツールをより深く理解し、適用できるようにします。

質問の内容

私は単一の顧客向けのソリューションを開発しています。顧客の従業員リストを取得するために API を呼び出す必要があります。ただし、この API (サードパーティ) は一度に 100 人の従業員しか返すことができません。したがって、次の 100 人の従業員のセットを取得するには、毎回オフセットを変更して同じ API を呼び出す必要があります。現在、これは単一のスレッドを使用して処理されるため、従業員の数が増えると、すべての従業員 (たとえば 30,000) を取得する時間も長くなります。 そして、このアプリにはそのような顧客がたくさんいます。

この問題の解決策として、#executorservice を使用してマルチスレッドを実装しようとしました。このソリューションを使用すると、クライアントのすべての従業員を取得するのに必要な時間が短縮されます。

###質問:###

API を呼び出すための複数のスレッドを持つエグゼキューター サービスでは、(複数のクライアントからの) 複数のスレッドはどのように機能しますか?
  1. マルチスレッド環境で次のロジックを使用すると、エンド ユーザーが間違ったデータを取得することになりますか? サンプルコード:
  2. ExecutorService executor = Executors.newFixedThreadPool(2);
    
      ServiceExecutor executor0 = new ServiceExecutor("0");
      ServiceExecutor executor1 = new ServiceExecutor("100");
    
      Future result0 = executor.submit(executor0);
      Future result1 = executor.submit(executor1);
       
      List<String> s1 = new ArrayList<>();
      s1.add(result0.get());
      s2.add(result1.get());
解決策

この質問に対する答えは、クライアントからのリクエストを受信するようにアプリケーションがどのように設定されているかによって大きく異なります。新しいエグゼキューター サービスは受信リクエストごとに作成されますか? それともエグゼキューター サービスはすべてのリクエストで共有されますか?リクエストごとに新しいエグゼキューター サービスを作成すると、あまり長く存在しない新しいスレッドにスペースを割り当てる必要があるため、非常に無駄になります。したがって、複数のリクエストに対して同じ ExecutorService を再利用する方が効率的です。

この場合、

newFixedThreadPool()

の代わりに Executors.newCachedThreadPool() を使用すると、ExecutorService がプール内のスレッド数を動的に増やすことができるため、より柔軟になる可能性があります。必要です。

以上が「Executor Service」Java でマルチスレッドを処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。