jdk 线程池 多线程使用经验总结

1.适合的使用场景

1.1C端操作,不关心这一部分代码的执行结果。可以使用多线程异步处理结果。

错误案例:C端操作,要返回结果,将要返回给C端结果代码放到异步线程里。

为什么不能直接这样做的原因:如果线程池要执行的任务很多,已经有很多任务在阻塞队列中等待,那么直接用主线程的效率比用异步线程的效率肯定会快些。就算没有任务在堵塞,主线程的效率也不见得比异步线程的慢。所以在这里使用异步线程的意义不是为了提高执行效率,而是不关心结果,可以直接返回,提高C端的响应速度。

如果C端操作,而处理又很多,需要很长时间,超过3s,可以将处理代码直接放到异步线程中,直接返回给C端。异步线程处理有结果了,放到缓存中,C端轮询查看结果,另外单独设页面去查看结果。

1.2复杂操作,有很多步,可以分步使用异步线程计算,汇总结果。

这个的前提肯定是逻辑处理非常复杂,这种情况一般很少见到。

1.3非C段操作,时间很长,很频繁的情况。比如定时任务,不适合放在异步线程中处理。

原因如下:非C段操作,对效率没要求,而且如果放在线程池中,会占用线程池的资源,其他需要提高性能的反而抢不到资源。另一方面,如果很频繁,也会造成线程池阻塞队列排满的情况,会有一部分被拒绝,JDK线程池默认使用的AbortPolicy(被拒绝的任务,会抛出异常)的拒绝策略。

综上所述:适合放在异步线程中的

1.4 JDK 线程池的参数配置经验

 public static final ExecutorService threadPool = new ThreadPoolExecutor(4,
            20, 0L,
            TimeUnit.MILLISECONDS, new LinkedBlockingQueue(2500),
           null, new ThreadPoolExecutor.CallerRunsPolicy());
corePoolSize(核心线程池):
maximumPoolSize:
keepAliveTime:
unit:
workQueue:
threadFactory:
handler:

猜你喜欢

转载自blog.csdn.net/wangzifei1234/article/details/88529395
今日推荐