2019独角兽企业重金招聘Python工程师标准>>>

第一种:创建一个定长的线程池,控制线程最大并发数,超出的会在队列中等待。

TestThreadPool.java

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class TestThreadPool {public static void main(String[] args) {long startTime = System.currentTimeMillis();    //获取开始时间ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);//设置线程池的最大线程数for (int i = 0; i < 10; i++) {final int index = i;//一般多线程并发都用finalfixedThreadPool.execute(new Runnable() {public void run() {System.out.println(index + "  " + Thread.currentThread().getName());}});}long endTime = System.currentTimeMillis();    //获取结束时间System.out.println("程序运行时间:" + (endTime - startTime) + "ms");}
} 

输出结果:         (当然输出结果不是固定的,不过线程数一定不会超过5个)

可以看到 Thread.currentThread().getName() 拿到的name只有5种,说明最大线程数控制在 5 个

第二种:创建一个可缓存的线程池,可以灵活回收空闲线程,若无可回收,则新建线程。

TestThreadPool1.java

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestThreadPool1 {public static void main(String[] args) {ExecutorService cachedThreadPool = Executors.newCachedThreadPool();for (int i = 0; i < 10000; i++) {final int index = i;cachedThreadPool.execute(new Runnable() {public void run() {System.out.println(index + "  " + Thread.currentThread().getName());}});}}
} 

输出结果的 Thread.currentThread().getName() 拿到的name有一两千种(当然不同环境和配置的机器的结果最大线程数是不同的)

第三种:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序执行。

TestThreadPool2.java

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestThreadPool2 {public static void main(String[] args) {ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();for (int i = 0; i < 10000; i++) {final int index = i;singleThreadExecutor.execute(new Runnable() {public void run() {System.out.println(index + "  " + Thread.currentThread().getName());}});}}
}  

输出结果:无论循环100次还是100000次,输出结果Thread.currentThread().getName()的值都会是

pool-1-thread-1

第四种:创建一个定长线程池,可以延时或定时周期性地执行任务。

TestThreadPool3.java

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class TestThreadPool3 {public static void main(String[] args) {ExecutorService singleThreadExecutor = Executors.newCachedThreadPool();for (int i = 0; i < 10; i++) {final int index = i;singleThreadExecutor.execute(new Runnable() {public void run() {try {while(true) {System.out.println(index + "  " + Thread.currentThread().getName());Thread.sleep(10 * 1000);}} catch (InterruptedException e) {e.printStackTrace();}}});}}
}

输出结果:每隔10s就会输出10行结果
                   

**使用 ScheduledExecutorService 的 scheduleAtFixedRate方法可以设置延时和执行间隔

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
Creates and executes a periodic action that becomes enabled first after the given initial delay,
and subsequently with the given period; that is executions will commence after initialDelay
then initialDelay+period, then initialDelay + 2 * period, and so on.

意思是创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 initialDelay 后开始执行,然后在 initialDelay+period 后执行,接着在 initialDelay + 2 * period 后执行,依此类推。

TestThreadPool4.java

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class TestThreadPool4 {public static void main(String[] args) {ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);System.out.println(System.currentTimeMillis());scheduledThreadPool.scheduleAtFixedRate(new Runnable() {public void run() {System.out.println(System.currentTimeMillis());}}, 5, 10, TimeUnit.SECONDS);}
}

从输出结果可以看出,延时5s后每隔10s会输出一次当前时间。

**使用ScheduledExecutorService的schedule可以设置首次执行延时

schedule(Runnable command, long delay, TimeUnit unit)
Creates and executes a one-shot action that becomes enabled after the given delay.

创建并执行在给定延迟后启用的一次性操作。

TestThreadPool5.java

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class TestThreadPool5 {public static void main(String[] args) {ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);for (int i = 0; i < 10; i++) {final int index = i;scheduledThreadPool.schedule(new Runnable() {public void run() {System.out.println(index + "  " + Thread.currentThread().getName());}}, 3, TimeUnit.SECONDS);}}
}

输出结果:运行3s后会输出10行结果,而不会每隔3s输出一行。

转载于:https://my.oschina.net/xiaozhiwen/blog/1602980

Java多线程之线程池的使用示例相关推荐

  1. java多线程之线程池简介

    前言 池化技术已经屡见不鲜了,比如数据库连接池,大家的项目中应该也用到了线程池.池化技术的好处:降低资源的消耗,提高响应速度,提高线程的可管理性.本篇主要是和大家一起分析下线程池的架构和它的工作流程. ...

  2. java多线程及线程池使用

    Java多线程及线程池的使用 Java多线程 一.Java多线程涉及的包和类 二.Java创建多线程的方式 三.Java线程池 1. 创建线程池ThreadPoolExecutor的7个参数 2. 线 ...

  3. Java多线程之线程池配置合理线程数

    Java多线程之线程池配置合理线程数 目录 代码查看公司服务器或阿里云是几核的 合理线程数配置之CPU密集型 合理线程数配置之IO密集型 1. 代码查看公司服务器或阿里云是几核的 要合理配置线程数首先 ...

  4. Java多线程之线程池的手写改造和拒绝策略

    Java多线程之线程池的手写改造和拒绝策略 目录 自定义线程池的使用 四种拒绝策略代码体现 1. 自定义线程池的使用 自定义线程池(拒绝策略默认AbortPolicy) public class My ...

  5. Java多线程之线程池7大参数、底层工作原理、拒绝策略详解

    Java多线程之线程池7大参数详解 目录 企业面试题 线程池7大参数源码 线程池7大参数详解 底层工作原理详解 线程池的4种拒绝策略理论简介 面试的坑:线程池实际中使用哪一个? 1. 企业面试题 蚂蚁 ...

  6. Java多线程之线程池详解

    Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...

  7. java 多线程使用线程池_Java多线程:如何开始使用线程

    java 多线程使用线程池 什么是线程? (What is a Thread?) A thread is a lightweight process. Any process can have mul ...

  8. java多线程和线程池

    目录 零.java线程理解 0.1 两种线程模型 0.1.1 用户级线程 ULT 0.1.2 内核级线程 KLT--JAVA虚拟机使用的线程模型(KLT) 0.2 java线程与系统内核线程 0.3 ...

  9. Java多线程之线程池的参数和配置

    在Java多线程编程中,线程池是一种常见的技术,用于管理线程的创建和销毁.线程池中的线程可以被重复利用,从而减少了线程的创建和销毁的开销,提高了程序的性能.在Java中,线程池的参数和配置非常重要,不 ...

最新文章

  1. 心系AI的百度,这次能翻身吗?
  2. AI实时筛查癌细胞,普通显微镜简单改装就能用,谷歌新突破登上Nature子刊
  3. 【Java萌新】MyBatis-Plus案例
  4. C语言实现下载网页的方法【原创】
  5. js list 合并_VIM学习笔记 脚本-列表(Script-List)
  6. json 文档拆分工具_如何把PDF多页文档拆为单页?快看高手私藏实用的技巧
  7. mysql+1.6安装,CentOS 6.6服务器编译安装lnmp(Nginx1.6.2+MySQL5.6.21+PHP5.6.3
  8. 各种PLC和触摸屏解密软件大全
  9. linux编程:yum 命令详解
  10. 三步必杀【洛谷P4231】
  11. NTSC色域(CIE1931)计算公式
  12. 西安电子科技大学计算机类考研数据速览
  13. 基于java的企业合同管理系统设计(含源文件)
  14. 带下划线点域名解析失败
  15. 【Java从零到架构师第二季】【07】JDBC FOR MySQL
  16. JavaSE 软件工程师 认证考试试卷3
  17. try-with-resource:自动地关闭资源
  18. 射频器件在电路中的分类
  19. CP-ABE,KP-ABE
  20. VMware虚拟机显示网络电缆已拔出

热门文章

  1. tf.keras.layers.MaxPool2D 示例 池化层
  2. 使用Jupyter Notebook编写技术文档
  3. 二、进程的状态与转换
  4. 【pytorch】nn.conv2d的使用
  5. 从LeetCode 679. 24 Game--C++ 解法--二十四点 到穷举24点所有可能性-24点大全
  6. C++多线程:Linux 线程通信,唤醒,互斥锁(未完待续)
  7. ubuntu/debian 安装SSH,并开启
  8. java类的运行顺序_Java语言类的基本运行顺序
  9. 聊聊Mysql的那些破事儿
  10. 快速入门分库分表概念原理