2016-09-30 8 views
-1

Вот мой следующий код:Почему не FixedThreadPool работает должным образом

ExecutorService executor = Executors.newFixedThreadPool(5); 

    executor.submit(new Runnable() { 
     public void run() { 
      for (int i = 0; i < 5; i++) { 
       System.out.println("Start"+" "+Thread.currentThread().getName()); 
       try { 
       Thread.sleep(100); 
       } catch (InterruptedException e) { 
       e.printStackTrace(); 
       } 
       System.out.println("End!"+" "+Thread.currentThread().getName()); 
      } 
     } 
    }); 

    executor.shutdown(); 
    executor.awaitTermination(1, TimeUnit.SECONDS); 

Вот мой результат:

Start pool-1-thread-1 
    End! pool-1-thread-1 
    Start pool-1-thread-1 
    End! pool-1-thread-1 
    Start pool-1-thread-1 
    End! pool-1-thread-1 
    Start pool-1-thread-1 
    End! pool-1-thread-1 
    Start pool-1-thread-1 
    End! pool-1-thread-1 

Я понимаю, что в моем коде там уже 5 нитей в FixedThreadPool. Поэтому, когда я запускаю свой код, он должен выводить все потоки 5, не так ли? Или я что-то не понимаю?

В моем выходе thread-1 начинается и заканчивается каждый раз, но не предполагается ли выводить все 5 нитей при его петлях в for loop? Причина, если только 1 thread делает task, тогда зачем нам нужно 5 threads? Есть ли способ все 5 нити может выводить на консоль? (Я новичок)

+7

Вы отправили одну задачу. Почему вы ожидаете, что он будет запущен на 5 потоках? –

+0

Я новичок, и да, я получил его сейчас. Спасибо. –

ответ

2

Вы публикуете только один Runnable, так что ваши ExecutorService пробегов один задачи. Он будет использовать только один поток. Чтобы использовать несколько потоков, вы должны позвонить по телефону submit несколько раз, или вы можете позвонить по номеру invokeAll с помощью Collection прогонов.

EDIT

Что-то вроде этого:

public void test() { 
    int numberOfThreads = 5; 
    ExecutorService executorService = Executors.newFixedThreadPool(numberOfThreads); 
    for(int i=0; i<numberOfThreads; i++){ 
     executorService.submit(createRunnable()); 
    } 
} 

private Runnable createRunnable() { 
    return new Runnable() { 
     @Override 
     public void run() { 
      for (int i = 0; i < 5; i++) { 
       System.out.println("Start" + " " + Thread.currentThread().getName()); 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       System.out.println("End!" + " " + Thread.currentThread().getName()); 
      } 
     } 
    }; 
} 
+0

Спасибо, я понял. Но можете ли вы предоставить мне код для 'invokeAll'. Я не знаю, как это сделать с помощью 'invokeAll'. Это будет оценено. –

+0

Что именно вы хотите? 5 потоков, каждый из которых распечатывает начальное и конечное сообщение? Или 5 нитей, каждый из которых имеет 5 циклов итерации, поэтому каждый поток будет печатать 5 стартовых и 5 конечных сообщений? – abbath

+0

Я хочу, чтобы каждый поток имел 5 циклов итерации, поэтому каждый поток печатал 5 стартовых и 5 конечных сообщений. –

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

  • Нет связанных вопросов^_^