上次一篇文章自信爆棚了,感觉自己已经搞定了线程池
结果最近跑程序,发现为什么每次没运行完线程池自己就结束了?
好吧,今天看了半天似乎半懂了他的原理=-=
就比如newFixedThreadPool()这个方法吧,最常用的
比如newFixedThreadPool(10)的意思就是
你有10台机器设备,可以同时接10个活;
假如你有100个任务,如果不做任何设置会立刻分配给这10台机器
当然我们也知道,10台机器智能干10个,那么剩下的90个就到了等待队列
如果这10个哪个搞定了,跑完了,就从这90个中取一个接着干
然而事实往往很难排90个,可能只能排20个(打比方)
也就是你最多接30个活,10个立刻开始干,还有20个等着,如果超过30个了,就只能销毁了,要不心理压力过大就崩溃了-_-
也就是线程池会一股脑的运行N个线程,能进池子的进池子,进不了的等着,太多了就丢弃了。
所以经验就是,大家弄任务不要一次加太多哦-0-
public static void testThreadPool(){
ExecutorService threadPool = Executors.newFixedThreadPool(2);
for (int i =0;i<5;i++){
threadPool.execute(new Runnable() {
@Override
public void run() {
// TODO 自动生成的方法存根
System.out.println("running");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
});
}
threadPool.shutdown();
System.out.println("already shutdown");
}运行的结果就是:
running
running
already shutdown
//等待2秒
running
running
//等待2秒
running
//等待2秒
//结束
本文深入探讨了Java中线程池的工作原理,特别是newFixedThreadPool方法的应用,并通过实例演示了如何合理设置线程池参数以避免因任务过多而导致线程提前结束的问题。
1080

被折叠的 条评论
为什么被折叠?



