一、创建线程池的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种方式相关推荐

  1. java线程池应用的好处_java高级应用:线程池全面解析

    什么是线程池? 很简单,简单看名字就知道是装有线程的池子,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程的复用. 线程池的好处 我们知道不用线程池 ...

  2. java从1到9构建完全二叉树_Java完全二叉树的创建与四种遍历方法分析

    Java完全二叉树的创建与四种遍历方法分析 发布时间:2020-10-01 11:58:56 来源:脚本之家 阅读:87 作者:泡0沫 本文实例讲述了Java完全二叉树的创建与四种遍历方法.分享给大家 ...

  3. java map初始化方式_java中Map和List初始化的两种方法

    第一种方法(常用方法): //初始化List List list = new ArrayList(); list.add("string1"); list.add("st ...

  4. java获取系统时间的几种方法_Java篇—获取当前系统时间的三种方式(超详细+多方法)...

    1.通过util包中的Date类来获取当前时间 方法1详细代码: public class Exercise17 { public static void main(String[] args){ D ...

  5. java创建一个未知长度的数组_Java数组的创建操作

    数组是一个固定长度的,包含了相同类型数据的 容器 步骤1:声明数组步骤2:创建数组步骤3:访问数组步骤4:数组长度步骤5:练习-数组最小值步骤6:答案-数组最小值 步骤 1 : 声明数组 int[] ...

  6. java的max函数比较三个数_java – 使用泛型创建返回较大函数的max函数

    在Java中,我如何使用泛型来创建一个max函数,该函数将两个相同类型的Comparable对象作为参数并返回较大的对象? 我试过了: public static T max(T obj1, T ob ...

  7. java 接口的声明和实现 总结_java知识总结(三):函数式接口

    函数式接口:只有一个抽象方法的接口. 函数式接口的特点: 函数式接口有且只有一个抽象方法. 函数式接口中可以有default方法和static方法(jdk8新增).private方法和private ...

  8. 线程池 java 新建方式_Java线程池的四种创建方式

    Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFi ...

  9. java创建线程池几种方式_Java 创建线程池两种不同方法的比较

    用Java做抓取的时候免不了要用到多线程的了,因为要同时抓取多个网站或一条线程抓取一个网站的话实在太慢,而且有时一条线程抓取同一个网站的话也比较浪费CPU资源.要用到多线程的等方面,也就免不了对线程的 ...

最新文章

  1. 看懂类图——UML类图基础
  2. element-ui 框架的checkbox组件:点击事件 与 选中判断 - 代码篇
  3. php由哪几部分组成,微型计算机通常是由哪几部分组成?
  4. 四大领域全面发力,腾讯云构筑全链路开发者服务体系
  5. 数据结构排序系列详解之三 冒泡排序
  6. SpringBoot(十七)_springboot跨域处理
  7. java mvc接收json_java相关:SpringMVC中controller接收json数据的方法
  8. 为什么要使用英英词典?
  9. Mac系统下编译并使用ijkplyer播放器
  10. IPv4 + IPv6 = IPv10?是的,IPv10就是IPV4 + IPv6!
  11. Kaggle数据集Telco-Customer-Churn.csv特征相关性分析(用LabelEncoder编码)
  12. 史上最全的常用开发工具类收集(持续更新中)
  13. oracle 执行计划中出现 merge join cartesian
  14. STM32-增量式旋转编码器测量
  15. 你的生存模式正确吗?
  16. 【STM32学习 自制STM32游戏机】
  17. 用Python做一个价值数万的市场调查报告程序,分分钟完成工作
  18. c++动态存储空间分配
  19. ta点读笔客户端_点读笔到底哪支好?12款点读笔评测:看完不再稀里糊涂
  20. python条件选择语句,Python中条件选择语句可以嵌套使用。

热门文章

  1. Stata:描述统计结果导出
  2. visdom安装及使用
  3. windows服务器通过nginx配置https
  4. 【Exception】WIN10蓝屏:SYSTEM_SERVICE_EXCEPTION 蓝屏: KERNEL-SECURITY-CHECK-FAILUR WIN10 vmware启动CentOS 蓝屏
  5. 7-2 歌唱比赛计分 (15分)
  6. 资产监测技术中关于GPS定位工具中的PDOP参数
  7. 胡学乱想----前端知识点(css)
  8. 锐捷交换机显示服务器,锐捷交换机查看时间命令
  9. EKP后端/开发/公式定义器 - 扩展 - 自定义函数(public)
  10. http://www.xueh188.top/index.php/archives/18/