文章目录

  • 前言
  • 一、线程池示例
  • 二、newCachedThreadPool 线程池示例
  • 三、newFixedThreadPool 线程池示例
  • 三、newSingleThreadExecutor 线程池示例

前言

在上一篇博客 【Java 并发编程】线程池机制 ( 测试线程开销 | 启动线程分析 | 用户态 | 内核态 | 用户线程 | 内核线程 | 轻量级进程 ) 中 , 分析了线程的开销 ;

本篇博客中使用线程池改造该示例并进行分析 ;

一、线程池示例


创建 101010 万线程 , 需要 109921099210992 ms ; 使用线程池启动 101010 万线程 , 仅需要 262626 ms ;

线程池的效率比线程高几个数量级 ;

线程池示例 :

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Main {/*** 线程中对该值进行累加操作*/private static int count = 0;public static void main(String[] args) throws InterruptedException {// 记录程序开始执行时间long startTime = System.currentTimeMillis();// 线程池ExecutorService executorService = Executors.newSingleThreadExecutor();// 每次线程执行完毕, 计数 -1 , 当计数减到 0 之后, 才能解除阻塞CountDownLatch countDownLatch = new CountDownLatch(100000);// 创建 10 万个线程, 开启线程后, 向集合中添加一个元素for (int i = 0; i < 100000; i ++) {executorService.execute(new Runnable() {@Overridepublic void run() {count ++;// 计数 -1countDownLatch.countDown();}});}// 阻塞等待计数 -1, 直到 10000 个线程执行完毕//  使用这种方式确定所有线程执行完毕countDownLatch.await();// 执行完毕后, 停掉线程池, 否则程序不会退出executorService.shutdown();// 记录程序执行结束时间long endTime = System.currentTimeMillis();// 打印消耗的时间System.out.println("耗时 : " + ( endTime - startTime ) + " ms , 最终 count = " + count);}
}

执行结果 : 原来使用线程需要 109921099210992 ms 时间 , 使用线程池后 , 仅需要 262626 ms , 这效率提升了好几个数量级 ;

等待线程执行结束 , 直接调用 Thread.join() 方法 , 等待线程池结束 , 借助 CountDownLatch 通过线程计数来确定线程是否执行完毕 ;

调用 ExecutorService executorService = Executors.newSingleThreadExecutor() 创建线程池 , 创建的是 FinalizableDelegatedExecutorService 线程池 ;

    public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));}

二、newCachedThreadPool 线程池示例


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Main {public static void main(String[] args) {ExecutorService executorService1 = Executors.newCachedThreadPool();for (int i = 0; i < 100; i ++) {executorService1.execute(new Task(i));}}static class Task implements Runnable {/*** 记录线程的索引 0 ~ 99*/private int i = 0;public Task(int i) {this.i = i;}@Overridepublic void run() {System.out.println("线程 ID : " + Thread.currentThread().getName() + " , 线程索引 : " + i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

执行结果 : 该线程池中创建了 100100100 个线程 , 执行 100100100 个任务 ;

三、newFixedThreadPool 线程池示例


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Main {public static void main(String[] args) {ExecutorService executorService2 = Executors.newFixedThreadPool(10);for (int i = 0; i < 100; i ++) {executorService2.execute(new Task(i));}}static class Task implements Runnable {/*** 记录线程的索引 0 ~ 99*/private int i = 0;public Task(int i) {this.i = i;}@Overridepublic void run() {System.out.println("线程 ID : " + Thread.currentThread().getName() + " , 线程索引 : " + i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

执行结果 : 该线程池中创建了 101010 个线程 , 执行 100100100 个任务 ;

三、newSingleThreadExecutor 线程池示例


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Main {public static void main(String[] args) {ExecutorService executorService3 = Executors.newSingleThreadExecutor();for (int i = 0; i < 100; i ++) {executorService3.execute(new Task(i));}}static class Task implements Runnable {/*** 记录线程的索引 0 ~ 99*/private int i = 0;public Task(int i) {this.i = i;}@Overridepublic void run() {System.out.println("线程 ID : " + Thread.currentThread().getName() + " , 线程索引 : " + i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

执行结果 : 该线程池中创建了 111 个线程 , 执行 100100100 个任务 ;

【Java 并发编程】线程池机制 ( 线程池示例 | newCachedThreadPool | newFixedThreadPool | newSingleThreadExecutor )相关推荐

  1. Java 并发编程——Executor框架和线程池原理

    Java 并发编程系列文章 Java 并发基础--线程安全性 Java 并发编程--Callable+Future+FutureTask java 并发编程--Thread 源码重新学习 java并发 ...

  2. [Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ...

    [Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ... 摘要 介绍 Java 并发包里的几个主要 ExecutorService . 正文 ...

  3. [Java并发编程(二)] 线程池 FixedThreadPool、CachedThreadPool、ForkJoinPool?为后台任务选择合适的 Java executors...

    [Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Jav ...

  4. 《Java并发编程的艺术》——线程(笔记)

    文章目录 四.Java并发编程基础 4.1 线程简介 4.1.1 什么是线程 4.1.2 为什么要使用多线程 4.1.3 线程优先级 4.1.4 线程的状态 4.1.5 Daemon线程 4.2 启动 ...

  5. Java并发编程|第二篇:线程生命周期

    文章目录 系列文章 1.线程的状态 2.线程生命周期 3.状态测试代码 4.线程终止 4.1 线程执行完成 4.2 interrupt 5.线程复位 5.1interrupted 5.2抛出异常 6. ...

  6. Java并发编程之锁机制之LockSupport工具

    关于文章涉及到的jdk源码,这里把最新的jdk源码分享给大家----->jdk源码 前言 在上篇文章<Java并发编程之锁机制之AQS(AbstractQueuedSynchronizer ...

  7. Java并发编程(08):Executor线程池框架

    本文源码:GitHub·点这里 || GitEE·点这里 一.Executor框架简介 1.基础简介 Executor系统中,将线程任务提交和任务执行进行了解耦的设计,Executor有各种功能强大的 ...

  8. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池

    并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...

  9. Java并发编程(8)——常见的线程安全问题

    线程安全问题: 多个线程同时执行也能工作的代码就是线程安全的代码 如果一段代码可以保证多个线程访问的时候正确操作共享数据,那么它是线程安全的. 具体说明: java并发线程实战(1) 线程安全和机制原 ...

最新文章

  1. 如何用java语法解析接口返回的json串?
  2. js-new、object.create、bind的模拟实现【转载备忘】
  3. 几个极品笑话,放松下心情
  4. “熊猫烧香”式的病毒营销
  5. cake-build -.Net Core 跨平台构建自动化系统。
  6. C#将WebBowser控件替换为Chrome内核
  7. linux命令解释程序实验,实验二 命令解释程序的使用
  8. webx学习(四)——ResourceLoadingService
  9. jQuery框架学习第八天:ASP.NET jQuery实施方案
  10. go使用makefile
  11. setFitView的zoom只是整数,导致缩放尺寸不合适的解决方案
  12. 分布形态的度量-偏度系数与峰度系数的探讨
  13. android 程序运行,Android如何保持程序一直运行
  14. 新版鸟哥Linux私房菜资料
  15. 1.5.33 计算分数加减表达式的值
  16. 数据交换格式与SpringIOC底层实现
  17. 嵌入式软件常见笔试面试题
  18. GPU价格暴跌,腾讯押注元宇宙,苹果在华招聘汽车人,今日更多大新闻在此
  19. linux下git安装和配置
  20. 荣耀7c升鸿蒙,荣耀也能升级!鸿蒙所需配置曝光:麒麟710起步

热门文章

  1. 备忘录(scanf和continue)
  2. albian开发笔记五--谈缓存同步
  3. MySQL 时间类型 DATE、DATETIME和TIMESTAMP
  4. MIT Molecular Biology 笔记5 转录机制
  5. linux jstat 命令监控gc情况
  6. Python学习(四)数据结构 —— set frozenset
  7. 使用GruntJS构建Web程序 (1)
  8. 代码分析 公用类库
  9. W - Pasha and Phone CodeForces - 595B (收益颇丰的数学题
  10. python 面向对象(三大特性)