2011-01-27 2 views
2

У меня есть 2 класса, которые реализуют Runnable.I необходимо создать 10 потоков для их выполнения. Я использую следующий код. неjava Многопоточность с использованием Executor

ExecutorService es = Executors.newFixedThreadPool(10); 
    Runnable r=new TestThread1(); 
    Runnable r1=new TestThread2(); 
    es.execute(r); 
    es.execute(r1); 

но так как существует только 2 runnables, только 2 нити используются для execute.how Шуд я увеличить нет нитей

+0

Вы хотите, чтобы вы запускали каждый Runnable на 5 потоках? – Rich

+0

да ... я хочу назначить больше потоков для одного запуска – ish

+0

У меня такое ощущение, что вы хотите сделать один runnable несколькими потоками - этого не может быть. Чтобы «распределить» задачу по нескольким потокам, вам нужно переписать код. –

ответ

1

Runnable Один может работать только на одном Thread. Он автоматически не разбивается на несколько потоков.

Если вы хотите использовать весь пул потоков, создайте более запущенные объекты.

3

Темы будут создаваться при отправке дополнительных работ исполнителю. Если количество отправленных заданий превышает 10 (в данном случае), новые задания будут поставлены в очередь. Когда потоки становятся свободными, они будут использоваться для запуска заданий в очереди. Если вы хотите, исполнитель создать 10 потоков, вы должны представить 10 работ:

for (int i = 0; i < 5; ++i) { 
    if (!es.isShutdown()) { 
     es.submit(new TestThread1()); 
     es.submit(new TestThread2()); 
    } 
} 
+0

У меня есть несколько операторов вставки базы данных в 2 запускаемых классах. Поскольку задания внутри цикла повторяются 5 раз, каждое значение вставляется 5 раз. Я хочу, чтобы этого не было. – ish

+0

Вам не нужно проверять, выключено ли его как ExecutorService имеет политику отклонения, которую вы можете изменить для обработки этого случая. –

0

Executors.newFixedThreadPool(size) возвращает ThreadPoolExecutor экземпляра.

JavaDoc из ThreadPoolExecutor говорит:»Когда новая задача представляется в методе ThreadPoolExecutor.execute, и меньше, чем corePoolSize потоков работают, новый поток создается для обработки запроса, даже если другие рабочие потоки простаивают. "

То есть, вы должны выполнить 10 потоков, чтобы заполнить пул.

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