java创建线程池几种方式_java知识总结-创建线程池的6种方式
一、创建线程池的6种方式:
Executors.newCachedThreadPool();
创建一个可缓存线程池,应用中存在的线程数可以无限大
Executors.newFixedThreadPool(2)
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
Executors.newScheduledThreadPool(2)
创建一个定长线程池,支持定时及周期性任务执行。
4 Executors.newSingleThreadExecutor();
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,
保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
5 Executors.newSingleThreadScheduledExecutor();
创建一个单例线程池,定期或延时执行任务。
6 Executors.newWorkStealingPool(3);
创建一个带并行级别的线程池,并行级别决定了同一时刻最多有多少个线程在执行,如不穿如并行级别参数,将默认为当前系统的CPU个数。
二、代码
线程代码
public class ThreadForpools implements Runnable {
private Integer index;
public ThreadForpools(Integer index) {
this.index = index;
}
@Override
public void run() {
/***
* 业务......省略
*/
try {
System.out.println(index + " 开始处理线程!!!");
Thread.sleep(index * 2000); //等2秒方便参观
System.out.println(index + " 我的线程标识是:" + this.toString());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
方式一:newCachedThreadPool
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 描述:newCachedThreadPool
* 创建一个可缓存线程池,应用中存在的线程数可以无限大
*/
public class ThreadpoolsCached {
public static void main(String[]args)
{
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
for(int i=0;i<10;i++)
{
final int index=i;
newCachedThreadPool.execute(new ThreadForpools(index));
}
}
}
借助jconsole工具看看线程,由下图可看。所有的线程一次性已经加载进来了。
线程执行完了,线程数也相应减少了,最后程序也就结束了。
2.jpg
方式二:newFixedThreadPool
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 描述:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
*/
public class ThreadpoolsFixed {
public static void main(String[]args)
{
//线程池允许同时存在两个线程
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(2);
for(int i=0;i<10;i++)
{
final int index=i;
newFixedThreadPool.execute(new ThreadForpools(index));
}
}
}
再看看jconsole的线程情况。只有两个线程。线程执行完后还会处于等待的状态。
线程
方式三:newScheduledThreadPool
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 描述:创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下
*/
public class ThreadpoolsScheduled {
/**
* 我们获取四次次线程,观察4个线程地址
* @param args
*/
public static void main(String[]args)
{
ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(2);
for(int i=0;i<10;i++)
{
final int index=i;
//延迟三秒执行
newScheduledThreadPool.schedule(new ThreadForpools(index),3, TimeUnit.SECONDS);
}
}
}
方式四:newSingleThreadExecutor
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 描述:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,
* 保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
*/
public class ThreadpoolsSingle {
public static void main(String[]args) {
ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
for(int i=0;i<10;i++)
{
final int index=i;
newSingleThreadExecutor.execute(new ThreadForpools(index));
}
}
}
方式五:newSingleThreadScheduledExecutor
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 描述:创建一个单例线程池,定期或延时执行任务。
*/
public class ThreadpoolsSingleThreadScheduled {
/**
* 我们获取四次次线程,观察4个线程地址
* @param args
*/
public static void main(String[]args) {
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
for(int i=0;i<10;i++)
{
final int index=i;
scheduledExecutorService.schedule(new ThreadForpools(index),3, TimeUnit.SECONDS);
}
}
}
方式六:
···
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
描述:创建一个带并行级别的线程池,并行级别决定了同一时刻最多有多少个线程在执行,
如不穿如并行级别参数,将默认为当前系统的CPU个数。
*/
public class ThreadpoolsWorkStealingPool {
public static void main(String[] args) throws Exception {
// 设置并行级别为2,即默认每时每刻只有2个线程同时执行
ExecutorService executorService = Executors.newWorkStealingPool(3);
for (int i = 1; i <= 50; i++) {
final int count=i;
executorService.submit(new ThreadForpools(count));
}
while(true){
//主线程陷入死循环,来观察结果,否则是看不到结果的
}
}
}
···
java创建线程池几种方式_java知识总结-创建线程池的6种方式相关推荐
- java线程池应用的好处_java高级应用:线程池全面解析
什么是线程池? 很简单,简单看名字就知道是装有线程的池子,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程的复用. 线程池的好处 我们知道不用线程池 ...
- java从1到9构建完全二叉树_Java完全二叉树的创建与四种遍历方法分析
Java完全二叉树的创建与四种遍历方法分析 发布时间:2020-10-01 11:58:56 来源:脚本之家 阅读:87 作者:泡0沫 本文实例讲述了Java完全二叉树的创建与四种遍历方法.分享给大家 ...
- java map初始化方式_java中Map和List初始化的两种方法
第一种方法(常用方法): //初始化List List list = new ArrayList(); list.add("string1"); list.add("st ...
- java获取系统时间的几种方法_Java篇—获取当前系统时间的三种方式(超详细+多方法)...
1.通过util包中的Date类来获取当前时间 方法1详细代码: public class Exercise17 { public static void main(String[] args){ D ...
- java创建一个未知长度的数组_Java数组的创建操作
数组是一个固定长度的,包含了相同类型数据的 容器 步骤1:声明数组步骤2:创建数组步骤3:访问数组步骤4:数组长度步骤5:练习-数组最小值步骤6:答案-数组最小值 步骤 1 : 声明数组 int[] ...
- java的max函数比较三个数_java – 使用泛型创建返回较大函数的max函数
在Java中,我如何使用泛型来创建一个max函数,该函数将两个相同类型的Comparable对象作为参数并返回较大的对象? 我试过了: public static T max(T obj1, T ob ...
- java 接口的声明和实现 总结_java知识总结(三):函数式接口
函数式接口:只有一个抽象方法的接口. 函数式接口的特点: 函数式接口有且只有一个抽象方法. 函数式接口中可以有default方法和static方法(jdk8新增).private方法和private ...
- 线程池 java 新建方式_Java线程池的四种创建方式
Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFi ...
- java创建线程池几种方式_Java 创建线程池两种不同方法的比较
用Java做抓取的时候免不了要用到多线程的了,因为要同时抓取多个网站或一条线程抓取一个网站的话实在太慢,而且有时一条线程抓取同一个网站的话也比较浪费CPU资源.要用到多线程的等方面,也就免不了对线程的 ...
最新文章
- 看懂类图——UML类图基础
- element-ui 框架的checkbox组件:点击事件 与 选中判断 - 代码篇
- php由哪几部分组成,微型计算机通常是由哪几部分组成?
- 四大领域全面发力,腾讯云构筑全链路开发者服务体系
- 数据结构排序系列详解之三 冒泡排序
- SpringBoot(十七)_springboot跨域处理
- java mvc接收json_java相关:SpringMVC中controller接收json数据的方法
- 为什么要使用英英词典?
- Mac系统下编译并使用ijkplyer播放器
- IPv4 + IPv6 = IPv10?是的,IPv10就是IPV4 + IPv6!
- Kaggle数据集Telco-Customer-Churn.csv特征相关性分析(用LabelEncoder编码)
- 史上最全的常用开发工具类收集(持续更新中)
- oracle 执行计划中出现 merge join cartesian
- STM32-增量式旋转编码器测量
- 你的生存模式正确吗?
- 【STM32学习 自制STM32游戏机】
- 用Python做一个价值数万的市场调查报告程序,分分钟完成工作
- c++动态存储空间分配
- ta点读笔客户端_点读笔到底哪支好?12款点读笔评测:看完不再稀里糊涂
- python条件选择语句,Python中条件选择语句可以嵌套使用。
热门文章
- Stata:描述统计结果导出
- visdom安装及使用
- windows服务器通过nginx配置https
- 【Exception】WIN10蓝屏:SYSTEM_SERVICE_EXCEPTION 蓝屏: KERNEL-SECURITY-CHECK-FAILUR WIN10 vmware启动CentOS 蓝屏
- 7-2 歌唱比赛计分 (15分)
- 资产监测技术中关于GPS定位工具中的PDOP参数
- 胡学乱想----前端知识点(css)
- 锐捷交换机显示服务器,锐捷交换机查看时间命令
- EKP后端/开发/公式定义器 - 扩展 - 自定义函数(public)
- http://www.xueh188.top/index.php/archives/18/