Я думал, что с помощью ThreadPoolExecutor мы можем отправить Runnable
для выполнения либо в BlockingQueue
, переданном в конструктор, либо с помощью метода execute
.
Также я понял, что если задача доступна, она будет выполнена.
Чего я не понимаю, так это:
public class MyThreadPoolExecutor {
private static ThreadPoolExecutor executor;
public MyThreadPoolExecutor(int min, int max, int idleTime, BlockingQueue queue){
executor = new ThreadPoolExecutor(min, max, 10, TimeUnit.MINUTES, queue);
//executor.prestartAllCoreThreads();
}
public static void main(String[] main){
BlockingQueue q = new LinkedBlockingQueue();
final String[] names = {"A","B","C","D","E","F"};
for(int i = 0; i < names.length; i++){
final int j = i;
q.add(new Runnable() {
@Override
public void run() {
System.out.println("Hi "+ names[j]);
}
});
}
new MyThreadPoolExecutor(10, 20, 1, q);
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*executor.execute(new Runnable() {
@Override
public void run() {
System.out.println("++++++++++++++");
}
}); */
for(int i = 0; i < 100; i++){
final int j = i;
q.add(new Runnable() {
@Override
public void run() {
System.out.println("Hi "+ j);
}
});
}
}
}
Этот код не делает абсолютно ничего, пока я не раскомментирую executor.prestartAllCoreThreads();
в конструкторе ИЛИ не вызову execute
исполняемого файла, который печатаетSystem.out.println("++++++++++++++");
(он также закомментирован ).
Почему?
Цитата (мой акцент):
By default, even core threads are initially created and started only when new tasks arrive, but this can be overridden dynamically using method prestartCoreThread() or prestartAllCoreThreads(). You probably want to prestart threads if you construct the pool with a non-empty queue.
В порядке. Так что моя очередь не пуста. Но я создаю executor
, делаю sleep
, а затем добавляю новые Runnable
в очередь (в цикле до 100 ).
Разве этот цикл не считается new tasks arrive
?
Почему это не работает, и я должен либо prestart
, либо явно вызывать execute
?