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
参考文献: