Java多线程之线程池的使用示例
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多线程之线程池的使用示例相关推荐
- java多线程之线程池简介
前言 池化技术已经屡见不鲜了,比如数据库连接池,大家的项目中应该也用到了线程池.池化技术的好处:降低资源的消耗,提高响应速度,提高线程的可管理性.本篇主要是和大家一起分析下线程池的架构和它的工作流程. ...
- java多线程及线程池使用
Java多线程及线程池的使用 Java多线程 一.Java多线程涉及的包和类 二.Java创建多线程的方式 三.Java线程池 1. 创建线程池ThreadPoolExecutor的7个参数 2. 线 ...
- Java多线程之线程池配置合理线程数
Java多线程之线程池配置合理线程数 目录 代码查看公司服务器或阿里云是几核的 合理线程数配置之CPU密集型 合理线程数配置之IO密集型 1. 代码查看公司服务器或阿里云是几核的 要合理配置线程数首先 ...
- Java多线程之线程池的手写改造和拒绝策略
Java多线程之线程池的手写改造和拒绝策略 目录 自定义线程池的使用 四种拒绝策略代码体现 1. 自定义线程池的使用 自定义线程池(拒绝策略默认AbortPolicy) public class My ...
- Java多线程之线程池7大参数、底层工作原理、拒绝策略详解
Java多线程之线程池7大参数详解 目录 企业面试题 线程池7大参数源码 线程池7大参数详解 底层工作原理详解 线程池的4种拒绝策略理论简介 面试的坑:线程池实际中使用哪一个? 1. 企业面试题 蚂蚁 ...
- Java多线程之线程池详解
Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...
- java 多线程使用线程池_Java多线程:如何开始使用线程
java 多线程使用线程池 什么是线程? (What is a Thread?) A thread is a lightweight process. Any process can have mul ...
- java多线程和线程池
目录 零.java线程理解 0.1 两种线程模型 0.1.1 用户级线程 ULT 0.1.2 内核级线程 KLT--JAVA虚拟机使用的线程模型(KLT) 0.2 java线程与系统内核线程 0.3 ...
- Java多线程之线程池的参数和配置
在Java多线程编程中,线程池是一种常见的技术,用于管理线程的创建和销毁.线程池中的线程可以被重复利用,从而减少了线程的创建和销毁的开销,提高了程序的性能.在Java中,线程池的参数和配置非常重要,不 ...
最新文章
- 心系AI的百度,这次能翻身吗?
- AI实时筛查癌细胞,普通显微镜简单改装就能用,谷歌新突破登上Nature子刊
- 【Java萌新】MyBatis-Plus案例
- C语言实现下载网页的方法【原创】
- js list 合并_VIM学习笔记 脚本-列表(Script-List)
- json 文档拆分工具_如何把PDF多页文档拆为单页?快看高手私藏实用的技巧
- mysql+1.6安装,CentOS 6.6服务器编译安装lnmp(Nginx1.6.2+MySQL5.6.21+PHP5.6.3
- 各种PLC和触摸屏解密软件大全
- linux编程:yum 命令详解
- 三步必杀【洛谷P4231】
- NTSC色域(CIE1931)计算公式
- 西安电子科技大学计算机类考研数据速览
- 基于java的企业合同管理系统设计(含源文件)
- 带下划线点域名解析失败
- 【Java从零到架构师第二季】【07】JDBC FOR MySQL
- JavaSE 软件工程师 认证考试试卷3
- try-with-resource:自动地关闭资源
- 射频器件在电路中的分类
- CP-ABE,KP-ABE
- VMware虚拟机显示网络电缆已拔出
热门文章
- tf.keras.layers.MaxPool2D 示例 池化层
- 使用Jupyter Notebook编写技术文档
- 二、进程的状态与转换
- 【pytorch】nn.conv2d的使用
- 从LeetCode 679. 24 Game--C++ 解法--二十四点 到穷举24点所有可能性-24点大全
- C++多线程:Linux 线程通信,唤醒,互斥锁(未完待续)
- ubuntu/debian 安装SSH,并开启
- java类的运行顺序_Java语言类的基本运行顺序
- 聊聊Mysql的那些破事儿
- 快速入门分库分表概念原理