创建线程池的方法
线程池的作用
线程复用
控制最大并发度
管理线程
5个创建方法
//看方法有五种线程池
ExecutorService threadPool = Executors.newFixedThreadPool(5);//一池5个处理线程
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();//一池一个处理线程
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();//一池N个线程
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);//创建拥有固定线程数量的定时线程任务的线程池
ExecutorService executorService = Executors.newWorkStealingPool();//创建ForJoin线程池
线程池应用举例
public static void main(String[] args) {
//看方法有五种线程池
ExecutorService threadPool = Executors.newFixedThreadPool(5);//一池5个处理线程
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();//一池一个处理线程
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();//一池N个线程
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);//创建拥有固定线程数量的定时线程任务的线程池
ExecutorService executorService = Executors.newWorkStealingPool();//创建ForJoin线程池
//模拟10个用户来办理业务,每个用户就是一个来自外部的请求线程
try {
for (int i = 0; i < 10; i++) {
cachedThreadPool.execute(() -> {
System.out.println(Thread.currentThread().getName()+"\t 办理业务");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
cachedThreadPool.shutdown();
}
}
高级的创建线程池的方法
ExecutorService executorService = new ThreadPoolExecutor(
2,
5,
1l,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardPolicy());
-
当请求到达线程池时,首先是由核心线程进行接待,当请求数量超过核心线程数后,超过核心线程数的请求会被放到阻塞队列里面去,当请求的数量超过阻塞队列大小时,线程池会开启还未开启的线程(小于等于最大线程数),当请求数量大于阻塞队列的线程数量和最大线程数量之和时,使用拒绝策略处理无法执行的任务
四种拒绝策略:
- AbortPolicy(默认):直接抛出异常阻止异常运行
- CallRunsPolicy:“调用者运行”,不会抛弃任务,也不会抛异常,而是将某些任务回退到调用队列中,如果是Main线程调用的话,会传回给Main线程
pool-1-thread-2 办理业务
pool-1-thread-3 办理业务
main 办理业务
pool-1-thread-1 办理业务
main 办理业务
pool-1-thread-2 办理业务
pool-1-thread-5 办理业务
pool-1-thread-2 办理业务
pool-1-thread-3 办理业务
pool-1-thread-4 办理业务
pool-1-thread-2 办理业务
pool-1-thread-5 办理业务
main 办理业务
pool-1-thread-1 办理业务
pool-1-thread-1 办理业务
- DiscardOldestPolicy:抛弃队列中等待最久的任务
- DiscardPolicy:直接丢弃任务,不处理也不抛异常
线程池的代码实践
public static void main(String[] args) {
ExecutorService executorService = new ThreadPoolExecutor(
2,
5,
1l,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());
//1. AbortPolicy: java.util.concurrent.RejectedExecutionException:
//2. CallerRunsPolicy: 谁调用回退给谁,main 办理业务
//3. DiscardOldestPolicy: 抛弃最老的
//4. DiscardPolicy : 直接抛弃
//模拟10个用户来办理业务,每个用户就是一个来自外部的请求线程
try {
for (int i = 0; i < 15; i++) {
executorService.execute(() -> {
System.out.println(Thread.currentThread().getName()+"\t 办理业务");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
executorService.shutdown();
}
}
线程池银行举例
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/202545.html