Java线程池优化思路
1.根据服务器配置调整线程池参数
根据服务器配置调整核心线程数,最大线程数和阻塞队列的大小。线程池太小会导致任务队列堆积,处理延迟;线程池太大会浪费资源。
2.合理使用任务队列
一般用数组型任务队列ArrayBlockingQueue和链表型队列LinkedBlockingQueue,ArrayBlockingQueue的读锁和写锁公用一把锁,而LinkedBlockingQueue的读锁和写锁是分开的,因此LinkedBlockingQueue效率更高。
3.合理使用拒绝策略
由调用的线程来处理被拒绝的线程:需要考虑是否会占用tomcat的线程数造成影响。适用于处理速率快,提交速率更快的场景。
拒绝但是抛出异常:适用于提交速率低的场景,确保任务不会被丢失。
拒绝不抛出异常:适用于提交效率高但是不重要的任务。
抛弃队列最前面的任务,重新提交被拒绝的任务:适用于处理速率蛮,提交速率快的场景。
4.避免线程的阻塞
当线程池的线程阻塞,会导致线程池效率变低,可以使用非阻塞IO,比如NIO和AIO等。
5.使用工具监控线程池
jconsole:
visualVM;