ThreadPoolExecutorを使用すると、コンストラクターで渡されるか、メソッドを使用しRunnable
て実行される s を送信できると思いました。
また、私の理解では、タスクが利用可能であれば実行されます。
私が理解していないのは次のとおりです。 BlockingQueue
execute
public class MyThreadPoolExecutor {
private static ThreadPoolExecutor executor;
public MyThreadPoolExecutor(int min, int max, int idleTime, BlockingQueue<Runnable> queue){
executor = new ThreadPoolExecutor(min, max, 10, TimeUnit.MINUTES, queue);
//executor.prestartAllCoreThreads();
}
public static void main(String[] main){
BlockingQueue<Runnable> q = new LinkedBlockingQueue<Runnable>();
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("++++++++++++++");
(これもコメントアウトされています)。
なんで?
引用(私の強調):
デフォルトでは、コアスレッドも最初に作成され、新しいタスクが到着したときにのみ開始されますが、メソッド prestartCoreThread() または prestartAllCoreThreads() を使用して動的にオーバーライドできます。空でないキューを使用してプールを構築する場合は、おそらくスレッドを事前に開始する必要があります。
Ok。だから私のキューは空ではありません。しかしexecutor
、私はを作成し、作成してから、sleep
新しいRunnable
をキューに追加します (100 へのループ内)。
このループは とカウントされnew tasks arrive
ませんか?
なぜそれが機能しないので、明示的に呼び出すか、prestart
または明示的に呼び出す必要がありますexecute
か?