问题描述
我是web项目,ssh结构页面发起一个请求,进action,然后进service,在service里执行ExecutorService es = Executors.newSingleThreadExecutor();开启一个单线程我有两个问题:1、在用户a请求时创建线程,当请求结束、线程执行完毕,线程会销毁吗?还是回到池里?2、当a请求时,线程执行中,这是b也发起请求,此时还会开个线程吗?还是等待a的线程执行完才执行b的线程?
解决方案
ExecutorService es = Executors.newSingleThreadExecutor();如果你的es是栈变量,那么每次都会开线程,B不会等待A。但是建议把es作为static field;因为:1.提现线程池的本意,线程池本来就有共享和循环利用的意思;2.如果es在每个请求里面都创建,那么你需要在请求最后把es shutdown,不然这个es的线程无法回收。而且这种用法根本不必要,如果你只是在想每个请求里面另起一个线程,那么new Thread就好了,线程池不共享就不需要用。
解决方案二:
你的Service是单例的吗?或者线程池是单例的吗?如果不是的话,就没必要使用线程池了。
解决方案三:
第一个问题:线程返回到池中。第二个问题二楼解释的很到位了。
解决方案四:
线程池有如下参数和内部变量maxActiveThread 最多活动线程数minIdleThread 最少空闲线程数maxIdleThread 最多空闲线程数currentActiveThread 当前活动线程currentIdleThread 当前空闲线程楼主提出的问题,是根据上面这些东西 共同决定的。不同场景会有不同的处理方式。比如, maxActiveThread=50minIdleThread=5maxIdleThread=20currentActiveThread=15currentIdleThread=20当线程执行完时,这个线程将先被返回给线程池,然后,检查,当前的空闲线程已经有20个了,那么这个线程就被放弃了。