大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
创建线程池的方法
一、创建线程池的三种方法
Executors.newSingleThreadExecutor(); //单个线程
Executors.newFixedThreadPool(5); //创建一个固定的线程池
Executors.newCachedThreadPool(); //创建一个可伸缩的线程池
1.newSingleThreadExecutor
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecuterTest1 {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newSingleThreadExecutor(); //单个线程
try {
for(int i=0;i<10;i++) {
threadPool.execute(()->{
System.out.println(Thread.currentThread().getName()+" ok");
});
}
}catch (Exception e) {
e.printStackTrace();
}finally {
//关闭线程池
threadPool.shutdown();
}
}
}
2. newFixedThreadPool
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecuterTest1 {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(5); //创建一个固定的线程池
try {
for(int i=0;i<10;i++) {
threadPool.execute(()->{
System.out.println(Thread.currentThread().getName()+" ok");
});
}
}catch (Exception e) {
e.printStackTrace();
}finally {
//关闭线程池
threadPool.shutdown();
}
}
}
3. newCachedThreadPool
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecuterTest1 {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newCachedThreadPool(); //创建一个可伸缩的线程池
try {
for(int i=0;i<10;i++) {
threadPool.execute(()->{
System.out.println(Thread.currentThread().getName()+" ok");
});
}
}catch (Exception e) {
e.printStackTrace();
}finally {
//关闭线程池
threadPool.shutdown();
}
}
}
二、三种方法的源码
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
//#############################################################
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
//############################################################
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE, //约等于20亿
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
- 以上三种方法中都调用ThreadPoolExecutor来创建线程池。
- 但三种方法都存在一定的弊端:
- (1)SingleThreadExecutor和FixedThreadPool允许的请求队列长度为Integer.MAX.VALUE,可能会导致OOM
- (2)CachedThreadPool允许的创建线程数量为Integer.MAX.VALUE,可能会导致OOM
ThreadPoolExecutor源码分析
public ThreadPoolExecutor(int corePoolSize, //核心线程池大小
int maximumPoolSize, //最大核心线程池大小
long keepAliveTime, //超时了没有人调用就会释放
TimeUnit unit, //超时单位
BlockingQueue<Runnable> workQueue, //阻塞队列
ThreadFactory threadFactory, //线程工厂,创建线程的,一般不用动
RejectedExecutionHandler handler) {
//拒绝策略
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/187308.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...