ThreadPoolExecutor и очередь

Я думал, что с помощью 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?

6
задан Cratylus 5 August 2012 в 21:12
поделиться