线程池
java中经常需要用到多线程来处理一些业务,我们非常不建议单纯使用继承Thread或者实现Runnable接口的方式来创建线程,那样势必有创建及销毁线程耗费资源、线程上下文切换问题。同时创建过多的线程也可能引发资源耗尽的风险,这个时候引入线程池比较合理,方便线程任务的管理。java中涉及到线程池的相关类均在jdk1.5开始的java.util.concurrent包中,涉及到的几个核心类及接口包括:Executor、Executors、ExecutorService、ThreadPoolExecutor、FutureTask、Callable、Runnable等。
Executors工具类(三大方法)
ExecutorService pool1 = Executors.newSingleThreadExecutor();//单个线程
ExecutorService pool2 = Executors.newFixedThreadPool(5);//创建一个固定线程池大小
ExecutorService pool3 = Executors.newCachedThreadPool();//自动伸缩,遇强则强
public class xianchengpool {
public static void main(String[] args) {
ExecutorService pool1 = Executors.newSingleThreadExecutor();//单个线程
ExecutorService pool2 = Executors.newFixedThreadPool(5);//创建一个固定线程池大小
ExecutorService pool3 = Executors.newCachedThreadPool();//自动伸缩,遇强则强
try {
for (int i = 0; i < 10; i++) {
pool1.execute(()->{
System.out.println(Thread.currentThread().getName()+ " 11" );
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
pool1.shutdown();
}
}
}
七大参数
int corePoolSize //核心线程池大小
int maximumPoolSize //最大核心线程池大小
long keepAliveTime //超时了没有人调用就会释放
TimeUnit unit //超时单位
BlockingQueue workQueue //阻塞队列
ThreadFactory threadFactory //线程工厂,创建线程的,一般不用动
RejectedExecutionHandler handle //拒绝策略
四种拒绝策略
new ThreadPoolExecutor .AbortPolicy() //银行满了,还有人进来,不处理这个人的,抛出异常
new ThreadPoolExecutor.CallerRunsPolicy() //哪来的去哪里!
new ThreadPoolExecutor.DiscardPolicy() //队列满了,丢掉任务,不会抛出异常!
new ThreadPoolExecutor.DiscardOldestPolicy() //队列满了,尝试去和最早的竞争,也不会抛出异常!
举例
public class pool2 {
public static void main(String[] args) {
ThreadPoolExecutor pool = new ThreadPoolExecutor(
2,
5,
3,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()
);
try {
for (int i = 0; i < 8; i++) {
pool.execute(()->{
System.out.println(Thread.currentThread().getName()+ " 11" );
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.shutdown();
}
}
}
CPU密集型和IO密集型(用于调优)
首先知道一个概念CPU运行效率远大于IO
这两种类型都是设置在设置最大线程的地方
cpu密集型可以保证cpu的运行效率 几何默认就是几
Runtime.getRuntime().availableProcessors()
ThreadPoolExecutor pool = new ThreadPoolExecutor(
2,
Runtime.getRuntime().availableProcessors(),
3,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()
);
io密集型 判断程序中消耗io的线程 设置时一般设置消耗线程的两倍
本文详细介绍了Java中线程池的使用,重点讲解了Executors工具类的三大方法,包括单线程、固定线程池和缓存线程池。此外,还深入讨论了七大参数、四种拒绝策略,并结合CPU密集型和IO密集型场景进行了调优实例。

997

被折叠的 条评论
为什么被折叠?



