线程池的三大方法、七大参数、四种拒绝策略
池话技术
程序运行就是要占用系统的资源、而池技术就相当于提前准备好程序运行所需要的资源, 程序运行的时候直接到池子里面取资源, 用完会就在放回到池中。比如:线程池、连接池、常量池等。
使用池化技术能够节约系统的资源,池化能够省略到系统反复创建资源的过程。而线程池就是为了能够实现线程的服用节约一部分的资源。
三大方法
1、 创建固定大小的线程池**
ExecutorService service = Executors.newFixedThreadPool(3);
2、 创建一个缓存的线程池, 大小可变
ExecutorService service1 = Executors.newCachedThreadPool();
3、创建一个单一的线程池
ExecutorService service2 = Executors.newSingleThreadExecutor();**
public class demo01 {
// 创建线程的三个方法
public static void main(String[] args) {
// 创建固定大小的线程池
ExecutorService service = Executors.newFixedThreadPool(3);
// 创建一个缓存的线程池, 大小可变
ExecutorService service1 = Executors.newCachedThreadPool();
// 创建一个单一的线程池
ExecutorService service2 = Executors.newSingleThreadExecutor();
try {
for (int i = 1; i <= 5; i++) {
service2.execute(() -> {
System.out.println(Thread.currentThread().getName());
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
service2.shutdown();
}
}
}
查看源码:三个创建线程池的方法都是使用T hreadPoolExecutor , 方法来创建的。
public class Executors {
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue());
}
// 创建线程的七个参数
public ThreadPoolExecutor(
int corePoolSize, // 核心线程池
int maximumPoolSize, // 最大核心线程池
long keepAliveTime, // 超时后没有人用就会释放
TimeUnit unit, // 超时单位
BlockingQueue<Runnable> workQueue, // 阻塞队列
ThreadFactory threadFactory // 线程工厂, 不需要动
) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, defaultHandler);
// defaultHandler 拒接策略
}
手动创建线程池
// 创建线程池
public class demo02 {
public static void main(String[] args) {
// 创建线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(1,![在这里插入图片描述](https://img-blog.csdnimg.cn/20200501230240283.png)
2,
3, TimeUnit.SECONDS, new LinkedBlockingDeque<>(3), Executors.defaultThreadFactory()
, new ThreadPoolExecutor.DiscardOldestPolicy()
);
try {
for (int i = 1; i <= 2; i++) {
// 线程池中, 使用 execute()来创建线程
executor.execute(() -> {
System.out.println(Thread.currentThread().getName() + "ok");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// shutdown ()来关闭线程池
executor.shutdown();
}
}
}
四种拒绝策略
/** * new ThreadPoolExecutor.AbortPolicy() // 银行满了,还有人进来,不处理这个人的,抛出异 常 * new ThreadPoolExecutor.CallerRunsPolicy() // 哪来的去哪里! * new ThreadPoolExecutor.DiscardPolicy() //队列满了,丢掉任务,不会抛出异常! * new ThreadPoolExecutor.DiscardOldestPolicy() //队列满了,尝试去和早的竞争,也不会 抛出异常! */
小结
public class demo03 {
/**
* 最大线程应该如何定义:
* 1、CPU密集型:最大线程数为CPU的核数
* 2、IO密集型: > 你的程序中十分消耗IO的线程
*
* @param args
*/
public static void main(String[] args) {
// 获取当前的 cpu 核数
System.out.println(Runtime.getRuntime().availableProcessors());
}
}