并发包里的ExecutorService线程池问题

我是web项目,ssh结构
页面发起一个请求,进action,然后进service,在service里执行ExecutorService es = Executors.newSingleThreadExecutor();开启一个单线程

我有两个问题:
1、在用户a请求时创建线程,当请求结束、线程执行完毕,线程会销毁吗?还是回到池里?
2、当a请求时,线程执行中,这是b也发起请求,此时还会开个线程吗?还是等待a的线程执行完才执行b的线程?

4个回答

ExecutorService es = Executors.newSingleThreadExecutor();
如果你的es是栈变量,那么每次都会开线程,B不会等待A。
但是建议把es作为static field;因为:
1.提现线程池的本意,线程池本来就有共享和循环利用的意思;
2.如果es在每个请求里面都创建,那么你需要在请求最后把es shutdown,不然这个es的线程无法回收。而且这种用法根本不必要,如果你只是在想每个请求里面另起一个线程,那么new Thread就好了,线程池不共享就不需要用。

线程池有如下参数和内部变量

maxActiveThread 最多活动线程数
minIdleThread 最少空闲线程数
maxIdleThread 最多空闲线程数

currentActiveThread 当前活动线程
currentIdleThread 当前空闲线程

楼主提出的问题,是根据上面这些东西 共同决定的。
不同场景会有不同的处理方式。

比如,
maxActiveThread=50
minIdleThread=5
maxIdleThread=20

currentActiveThread=15
currentIdleThread=20

当线程执行完时,这个线程将先被返回给线程池,然后,检查,当前的空闲线程已经有20个了,那么这个线程就被放弃了。

第一个问题:
线程返回到池中。

第二个问题二楼解释的很到位了。

你的Service是单例的吗?或者线程池是单例的吗?
如果不是的话,就没必要使用线程池了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问