我认为使用ThreadPoolExecutor我们可以提交Runnable
要BlockingQueue
在构造函数中传递或使用execute
方法执行的 s。
另外我的理解是,如果任务可用,它将被执行。
我不明白的是:
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() 动态覆盖。如果您使用非空队列构造池,您可能希望预启动线程。
行。所以我的队列不是空的。但是我创建了s ,然后我将新executor
的s 添加到队列中(在循环中到 100)。
这个循环不算吗?
为什么它不起作用,我必须要么或明确地打电话?sleep
Runnable
new tasks arrive
prestart
execute