线程池使用的几个疑问?

  1. lts定时任务内部有个IO密集型的逻辑,我在里边开3个线程来处理。定时任务半小时执行一次,线程单次执行时间0-5分钟(有数据的时候多,没数据的时候直接就结束了)。这种场景需要线程池吗?我认为是不需要的。第一是定时任务是全局单例的,不会出现多次调用,创建线程数>3的请况,第二,我的这个工作线程执行时间可能会很长,如果我用全局的线程池,我这个线程就会一直占着里边的线程,如果核心线程数太小,后边的线程会一直等待。所以,我认为这种场景不需要线程池
  2. 我自己实现了一个分布式锁。先获取锁,获取锁之后开一个新线程A,新线程wait(5s)后释放锁。当前我的获取锁的线程执行完逻辑会notify这个线程A。这种情况我认为是需要线程池的,因为这个操作是暴露给用户的,也就是说用户一进入这个操作,我就会创建一个线程。用户多的时候,线程可能会很多。 但是因为我这个线程悲观的情况下可能会出现大量的等足5秒的情况,我这里如果使用全局的线程池,也会造成其他线程的等待。所以,我这里单独创建了一个全局的单例newFixedThreadPool来为我的这个锁提供线程。
  3. newFixedThreadPool因为核心线程的存在,所以不会自动销毁。在我们的web程序中,如何正确的销毁它?有人说在容器关闭,显式调用shutdown方法,问题是我需要把这个代码放到哪里?还是说我可以放到spring bean的destory方法里呢?

以上几个疑问欢迎大佬们答疑解惑,不胜感激。


回答:

emmm,参与讨论。全是个人观点。

  1. 我没太明白你是整个任务使用一个线程,即对线程池来说,这个1个任务。还是这个定时任务又分成很多任务,全部装进线程池完成,这样就是N个任务。第一种当然没必要,因为定时任务一般本来就是在不同线程执行,即使在分个线程出来完成也和套娃差不多,不知道意义在哪,而且直接造成资源浪费 以及提高资源耗尽 带来的死锁概率。至于第二种主要看能否接受单线程的执行效率,如果在定时任务中,单线程的效率完全可以接受,就没有必要使用线程池,这是最安全,最稳妥的办法。在异步执行任务中使用同一线程池执行其他任务,资源耗尽带来的死锁问题大大提高。不过也有办法解决就是,比如使用无界队列 或者同步移交队列。不过这东西,谁能保证呢?
  2. 这个问题,从根本上解决是需要一个限时锁,到时间自己就释放了,让其他线程争抢。按照你这种思路的话,从逻辑上来说应该使用thread 这个或者无边界的线程池。比如极端情况有10个人获取了锁,而你的线程只有5个,剩下5个连等待的机会都没有,当然,你或许更愿意看见这种情况。
  3. 这个问题如果在spring中其实是有答案的,参考ThreadPoolExecutorFactoryBean , 提供executorService 的生命周期的管理,其实自己管理也不麻烦,就是没它这么精细就是了。


回答:

使用线程池可能有几个目的,1限制线程数量,避免大量创建线程耗尽系统资源;2重用线程,减小创建线程的开销,主要是提高高并发场景下的性能;

从你描述的第一个场景,貌似你想要的其实就是多线程提高处理io密集场景的效率,用线程池还是创建新线程没什么区别,况且还是定时任务,不存在对响应速度之类的要求

第二个场景没看明白你要干啥

最后一个问题,如果是局部变量的那就在方法内判断线程池任务是否执行完,执行完以后调shutdown就行了,全局的按你说的利用spring的生命周期是可以的,但是全局的大可以不关,因为线程池的生命周期相当于跟进程一致的,进程在就起着,进程没了你不用关也没有了

以上是 线程池使用的几个疑问? 的全部内容, 来源链接: utcz.com/p/944385.html

回到顶部