java线程-四种线程池的使用
Posted 码在江湖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java线程-四种线程池的使用相关的知识,希望对你有一定的参考价值。
一、为什么要使用线程池
先谈谈直接建立Thread的弊端:
1、每次执行不同的任务都需要新建线程,浪费资源和时间
2、缺乏统一的管理,容易出现自锁的现象
再来对比说说使用线程池的优势:
1、起到重用线程的作用,减少时间和资源的浪费
2、可有效的控制线程的总数,避免资源的浪费
3、有更多的功能比如定期执行
二、直接上代码:
单线程化线程池:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * * @version: 1.1.0 * @Description: 单线程化线程池 * @author: wsq * @date: 2020年7月1日下午9:02:00 */ public class SingleThreadPoolTest { public static void main(String[] args) { ExecutorService singleThreadPool = Executors.newSingleThreadExecutor(); for(int i = 0;i < 100;i++) { int j = i; singleThreadPool.execute(() -> { System.out.println(Thread.currentThread().getName()+":"+j); }); } } }
定长线程池:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * * @version: 1.1.0 * @Description: 定长线程池,规定允许呦最大数量的线程 * @author: wsq * @date: 2020年7月1日下午8:20:41 */ public class FixThreadPoolTest { public static void main(String[] args) { // 传入最大线程的数量 ExecutorService fixThreadPool = Executors.newFixedThreadPool(6); for(int i = 0;i < 100;i++) { int j = i; fixThreadPool.execute(() -> System.out.println(Thread.currentThread().getName()+":"+j)); } } }
缓存线程池:
/** * * @version: 1.1.0 * @Description: 缓存线程池,此线程池不会对线程池大小做限制,jvm根据任务情况自动增减线程 * * @author: wsq * @date: 2020年7月1日下午8:09:39 */ public class CacheThreadPoolTest { public static void main(String[] args) { ExecutorService cacheThreadPool = Executors.newCachedThreadPool(); for(int i = 0;i < 100;i++) { int j = i; cacheThreadPool.execute(() -> { System.out.println(Thread.currentThread().getName()+":"+j); }); } } }
周期线程池:
/** * * @version: 1.1.0 * @Description: 周期线程池 * @author: wsq * @date: 2020年7月1日下午8:32:13 */ public class ScheduleThreadPool { public static void main(String[] args) { ScheduledExecutorService scheduleThreadPool = Executors.newScheduledThreadPool(3); Runnable r1 = () -> {System.out.println("线程:"+Thread.currentThread().getName()+"3秒后开始执行任务r1");}; scheduleThreadPool.schedule(r1, 3, TimeUnit.SECONDS); Runnable r2 = () -> {System.out.println("线程:"+Thread.currentThread().getName()+"延迟2秒每3秒执行任务r2");}; scheduleThreadPool.scheduleAtFixedRate(r2, 2, 3, TimeUnit.SECONDS); Runnable r3 = () -> {System.out.println("线程开始执行r3了");}; for(int i = 0;i < 50;i++) { scheduleThreadPool.execute(r3); } } }
以上是关于java线程-四种线程池的使用的主要内容,如果未能解决你的问题,请参考以下文章