一: newSingleThreadExecutor

创建一个单线程的线程池,以无界队列方式运行。这个线程池只有一个线程在工作(如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。)此线程池能够保证所有任务的执行顺序按照任务的提交顺序执行,同一时段只有一个任务在运行。

此类型线程池特别适合于需要保证执行顺序的场合。

package com.clzhang.sample.thread;import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;public class ThreadPoolTest1 {static class MyThread implements Runnable {private String name;public MyThread(String name){this.name = name;}
        @Overridepublic void run() {for (int i = 0; i < 2; i++) {// 做点事情try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}// 如果用Thread.currentThread().getName()方法获取当前线程名称,则不会得到你想到的结果。System.out.println(name + " said:" + i);}}}
public static void main(String[] args) {// 创建线程池ExecutorService threadPool = Executors.newSingleThreadExecutor();
//        ExecutorService threadPool = Executors.newFixedThreadPool(2);
//        ExecutorService threadPool = Executors.newCachedThreadPool();
// 向线程池里面扔任务for (int i = 0; i < 4; i++) {threadPool.execute(new MyThread("Thread" + i));}
// 关闭线程池
        threadPool.shutdown();}
}

void execute(Runnable command):

在未来某个时间执行给定命令。该命令可能在新的线程、已入池的线程或者正调用的线程中执行,这由Executor决定。

void shutdown():

启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其它作用。

输出:

Thread0 said:0
Thread0 said:1
Thread1 said:0
Thread1 said:1
Thread2 said:0
Thread2 said:1
Thread3 said:0
Thread3 said:1

二:newFixedThreadPool

创建固定大小的线程池,以无界队列方式运行。线程池满且线程都为活动状态的时候如果有新任务提交进来,它们会等待直到有线程可用。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。显式调用shutdown将关闭线程池。

此类型线程池比较符合常用场合。

更改注释以使得上面的示范代码中下述这代码可用:

ExecutorService threadPool = Executors.newFixedThreadPool(2);

输出:

Thread0 said:0
Thread1 said:0
Thread0 said:1
Thread1 said:1
Thread2 said:0
Thread3 said:0
Thread3 said:1
Thread2 said:1

三:newCachedThreadPool

创建一个可缓存的线程池。必要的时候创建新线程来处理请求,也会重用线程池中已经处于可用状态的线程。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程;当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

此类型线程池特别适合于耗时短,不需要考虑同步的场合。

更改注释以使得上面的示范代码中下述这代码可用:

ExecutorService threadPool = Executors.newCachedThreadPool();

输出:

Thread0 said:0
Thread2 said:0
Thread3 said:0
Thread1 said:0
Thread0 said:1
Thread2 said:1
Thread3 said:1
Thread1 said:1

四:newScheduledThreadPool

创建可定时运行(初始延时),运行频率(每隔多长时间运行,还是运行成功一次之后再隔多长时间再运行)的线程池。

此类型线程池适合定时以及周期性执行任务的场合。

package com.clzhang.sample.thread;import java.util.*;
import java.text.SimpleDateFormat;import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class ThreadPoolTest2 {// 格式化时间private static SimpleDateFormat MY_SDF = new SimpleDateFormat("mm:ss");static class MyThread implements Runnable {@Overridepublic void run() {// 做点事情try {Thread.sleep(1000);                System.out.println("[" + MY_SDF.format(new Date()) + "]finished job!");} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {// 创建线程池ScheduledExecutorService schedulePool = Executors.newScheduledThreadPool(1);System.out.println("[" + MY_SDF.format(new Date()) + "]starting...");
// 初始延迟2秒后,只运行一次schedulePool.schedule(new MyThread(), 2, TimeUnit.SECONDS);// 只运行一次,可以关闭池;下面的两种方式(scheduleAtFixedRate/scheduleWithFixedDelay)则不可以关闭线程池!
         schedulePool.shutdown();
// 初始延迟2秒后,每间隔3秒运行一次线程
//        schedulePool.scheduleAtFixedRate(new MyThread(), 2, 3, TimeUnit.SECONDS);// 初始延迟2秒后,每运行成功后再等3秒运行一次线程
//        schedulePool.scheduleWithFixedDelay(new MyThread(), 2, 3, TimeUnit.SECONDS);
}
}

三个片段分别运行后的输出:
[04:48]starting...
[04:51]finished job!      // 延时2秒后启动线程

-------------------------------------

[06:14]starting...
[06:17]finished job!      // 初始延时2秒后启动线程
[06:20]finished job!      // 每隔3秒运行一次线程
[06:23]finished job!
......

-------------------------------------

[06:56]starting...
[06:59]finished job!      // 初始延时2秒后启动线程
[07:03]finished job!      // 上次线程运行成功后再等3秒再次启动
[07:07]finished job!
......

转载于:https://www.cnblogs.com/nayitian/p/3261678.html

Java:多线程,线程池,用Executors静态工厂生成常用线程池相关推荐

  1. Java多线程闲聊(四):阻塞队列与线程池原理

    Java多线程闲聊(四)-阻塞队列与线程池原理 前言 复用永远是人们永恒的主题,这能让我们更好地避免重复制造轮子. 说到多线程,果然还是绕不开线程池,那就来聊聊吧. 人们往往相信,世界是存在一些规律的 ...

  2. 多线程—线程池Executor框架及四种常用线程池

    池化技术应用:线程池.数据库连接池.http连接池等等. 池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率. 使用线程池的好处: 降低资源消耗:通过重复利用已创建的线程降低线程创建和 ...

  3. Java 9 JShell示例:集合静态工厂方法

    这篇文章继续了My My Java 9 Features博客文章中对Java9功能的探索. 在这里,我们在List,Set和Map接口中试验Java9 Collections静态工厂方法. 集合静态工 ...

  4. 一起读经典-《Effective Java》1.1 考虑使用静态工厂方法代替构造器

    1.静态工厂方法相较于构造器的优点 a.静态工厂方法能够自定义名称,使代码可读性更高 b.不必在每次调用的时候都创建新的实例 c.可以返回类型的子类型对象 2.静态工厂方法的常用名称: value o ...

  5. Java多线程学习五:哪些场景需要额外注意线程安全问题及多线程也可能引起性能问题

    访问共享变量或资源 第一种场景是访问共享变量或共享资源的时候,典型的场景有访问共享对象的属性,访问 static 静态变量,访问共享的缓存,等等.因为这些信息不仅会被一个线程访问到,还有可能被多个线程 ...

  6. 《Effective Java》学习笔记 - (1) 使用静态工厂方法代替构造器

    文章目录 前言 使用静态工厂方法代替构造器 1. 优点 1.1 静态工厂方法有名称 1.2 不必每次调用的时候都创建一个对象 1.3 可以返回类型的任何子类型的对象 1.4 所返回的对象的类型可以随着 ...

  7. Effective Java 第一条:考虑用静态工厂方法代替构造器

    优势: 第一条:静态工厂方法有名称,可以从名字看出方法的作用,容易使用. 第二条:不必每次调用都创建一个新对象. 第三条:静态工厂方法可以返回原类型的任何子类型的对象. 第四条:在创建参数化类型的实例 ...

  8. 掌握JAVA多线程的利器-线程池

    为什么80%的码农都做不了架构师?>>>    相信大多数接触过多线程的朋友都会有这样的困惑,明明使用了多线程,为何还是一团糟?用下面两幅图再合适不过了: 理想情况下的多线程VS 现 ...

  9. Java多线程(十一)之线程池深入分析(上)

    线程池是并发包里面很重要的一部分,在实际情况中也是使用很多的一个重要组件. 下图描述的是线程池API的一部分.广义上的完整线程池可能还包括Thread/Runnable.Timer/TimerTask ...

最新文章

  1. python设置画布背景图_如何使画布中的背景图像随窗口展开?
  2. java 自助更改密码 api_搭建ldap自助修改密码系统--Self Service Password
  3. 【Erlang应用】消息队列RabbitMQ介绍以及应用案例
  4. 数据库原理与应用(SQL Server)笔记 第六章 数据完整性
  5. linux用户空间寄存器,在Linux用户空间中访问硬件寄存器
  6. 又一家公司被吃到上市了,每天卖出490吨辣条
  7. vs在linux下的环境搭建,linux下vscode环境配置
  8. css 横线_web前端入门到实战:CSS 搞怪的 text-decoration
  9. php 筛选搜索,筛选——搜索
  10. [原]Oracle外部表结合游标完成统计一例
  11. 论坛模块_版块管理_增删改查实现上下移动
  12. Mongodb 3.0 创建用户
  13. windows下安装mongodb4.x版本
  14. 老司机 iOS 周报 #37 | 2018-09-24
  15. php显示网络图片,PHP在服务器端怎么显示图片呢?
  16. 我的css reset
  17. RIPv1配置(Enabling Rip)
  18. 漫画 | 前端发展史的江湖恩怨情仇
  19. 做绿色数据中心基础设施建维服务认证有哪些好处?
  20. Excel VBA——两种获取使用最大行数的方法

热门文章

  1. mysql集群异地部署_linux 环境下 部署mysql 集群
  2. Python字符串endswith()
  3. android布局参照示例_约束布局Android示例–第2部分
  4. jms.jar 2.0_JMS API概述:JMS 1.x和JMS 2.x
  5. 在命令行中使用ssh连接远程服务器
  6. WPF自适应可关闭的TabControl 类似浏览器的标签页
  7. 唠唠SE的IO-03——字符输入输出流
  8. ORACLE 锁表处理,解锁释放session
  9. IEnumerable 和 IEnumerator
  10. 《面向模式的软件体系结构1--模式系统》读书笔记(7)--- 通信