2015-02-05 3 views
2

Я довольно новичок с исполнителями java, так что это, возможно, простой вопрос.Исполнители Распределение задач по потокам

ExecutorService executorService = Executors.newFixedThreadPool(NumberOfThreads - 1); 

     do_work(); 
     for(int i = 1; i < NumberOfThreads; i++) 
     { 
      executorService.execute(new Runnable() 
      {         
       public void run() 
       { 
        do_work(); 
       } 
      });    
     } 

Мой вопрос:

Если я создаю фиксированный пул потоков с потоками «N», и если я хочу, чтобы выполнить задачи «N», как приведенный выше код. У меня есть гарантии, что каждый поток выполнит только одну задачу (do_work())?

ответ

3

№ Это пул, и назначение потоков для задач не дает таких гарантий.

например. Представьте, что ваш метод do_work() завершается немедленно. Когда вы отправите свой второй Runnable, все потоки в пуле будут доступны, и любой из них станет кандидатом на вашу работу.

+0

@dreamcrash: о каких «id» вы говорите? – Holger

+0

Thread.currentThread(). GetId(), но поколения не производятся от 0 (мастер) до N - 1 потоков, как я хочу. – dreamcrash

+0

@dreamcrash: эти номера идентификаторов потоков никогда не указываются, чтобы начинаться с нуля или быть в порядке возрастания. Есть 2⁶³ возможных значений, и они могут быть повторно использованы, когда поток завершается. Создание задач, зависящих от этих идентификационных номеров, обычно является плохой идеей. Поэтому не просите предложений о том, как сделать эту работу с «Исполнителем»; просто измените дизайн. – Holger

Смежные вопросы