3

重複の可能性:
ThreadPool および JobQueue

  1. マネージャーは、ジョブをジョブ キューに指定します (キュー サイズは固定ではありません)。
  2. スレッドは、固定数の ThreadPool によって維持されます。
  3. ジョブ キューにジョブがあるときはいつでも、Frame は ThreadPool からスレッドをジョブに割り当てます。
  4. キューにジョブがない場合、スレッドはジョブが到着するまで待機する必要があります。(ステップ 3 & 4 の繰り返し)

可能であれば、コードについても言及してください。

4

3 に答える 3

4

BlockingQueueタスクをキューに入れ、ExecutorServiceワーカーでタスクを処理する必要があります。

サンプル ソース コード:

    final BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
    queue.put("test");// Add item here
    ExecutorService service = Executors.newFixedThreadPool(10);// specifynumber
                                                                // of thread
            int numWorkers = 10;
    for (int i = 0; i < numWorkers; i++) {
        service.submit(new Runnable() {

            @Override
            public void run() {
                while (!Thread.currentThread().isInterrupted()) {
                    try {
                        String item = queue.take();
                        // Process item
                    } catch (InterruptedException ex) {
                        Thread.currentThread().interrupt();
                        break;
                    }
                }
            }
        });
    }

説明:

マネージャーは、ジョブをジョブ キューに指定します (キュー サイズは固定ではありません)。

ジョブを保持するブロッキング キューを宣言します。Stringここにジョブを表すと入力します。

final BlockingQueue<String> queue = new LinkedBlockingQueue<String>();

スレッドは、固定数の ThreadPool によって維持されます。

サイズをExecutorService合わせてご利用ください。FixedThreadPool

ExecutorService service = Executors.newFixedThreadPool(10);

ジョブ キューにジョブがあるときはいつでも、Frame は ThreadPool からスレッドをジョブに割り当てます。

操作を使用してジョブをキューに送信しますput

queue.put("test"); 

take()ブロックしている操作を使用する

queue.take();//When there is job it will return the value else will get block

参考文献:

于 2012-11-02T09:29:11.173 に答える
1

ExecutorService を使用して、タスクをキューに入れ、スレッド プールを管理します。

マネージャーは、ジョブをジョブ キューに指定します (キュー サイズは固定ではありません)。

ExecutorService にタスクを送信して、各ジョブを処理します。submit(Runnable)

スレッドは、固定数の ThreadPool によって維持されます。

AExecutors.newFixedThreadPool(n_threads)は固定サイズのスレッドプールです

ジョブ キューにジョブがあるときはいつでも、Frame は ThreadPool からスレッドをジョブに割り当てます。

ExecutorService は、スレッドが解放されると、ジョブをスレッドに割り当てます。

キューにジョブがない場合、スレッドはジョブが到着するまで待機する必要があります。

タスクのないスレッドはアイドル状態であり、リソースへの影響はほとんどありません。

于 2012-11-02T09:32:34.673 に答える
0

JDK 5 以上を使用している場合は、JDK のExecutorを使用します。ジョブは Callable インターフェースの実装です。ExecutorService はエグゼキューターへのファサードです。

于 2012-11-02T09:25:16.530 に答える