Java:多线程,线程池,用Executors静态工厂生成常用线程池
一: 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;
}
@Override
public 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 {
@Override
public 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!
......
Java:多线程,线程池,用Executors静态工厂生成常用线程池的更多相关文章
- “全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第二十五章:生产者与消费者线程详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第三十六章:如何设置线程的等待截止时间
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 下一章 "全栈2019"J ...
- java 多线程总结篇2之——Thread类及常用函数
此片文章主要总结的是Thread类及相关的基础概念和API,首先需要厘清线程调度中的几个基本概念: 一.线程调度的基本方法 1.调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会 ...
- java——多线程的实现方式、三种办法解决线程赛跑、多线程数据同步(synchronized)、死锁
多线程的实现方式:demo1.demo2 demo1:继承Thread类,重写run()方法 package thread_test; public class ThreadDemo1 extends ...
- Java多线程和并发(一),进程与线程的区别
目录 1.进程和线程的由来 2.进程和线程的定义 3.进程和线程的区别 一.进程和线程的区别 1.进程和线程的由来 2.进程和线程的定义 进程是资源分配的最小单位,线程是CPU调度的最小单位 3.进程 ...
- 二、java多线程编程核心技术之(笔记)——如何停止线程?
1.异常法 public class MyThread extends Thread { @Override public void run() { super.run(); try { for (i ...
- java多线程系类:基础篇:02常用的实现多线程的两种方式
本章,我们学习"常用的实现多线程的2种方式":Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多 ...
- Java 多线程之生产者消费者(多个生成者多个消费者)synchronized 和lock多线程通讯和同步实现
public class ProducterConsumerSample { public static void main(String[] args) { Resourse res = new R ...
随机推荐
- js数组对象深度复制
var deepCopy = function(o) { if (o instanceof Array) { var n = []; for (var i = 0; i < o.length; ...
- 【Nodejs】“快算24”扑克牌游戏算法 1.02
快算24是一种挺好的锻炼孩子算数能力的扑克牌游戏,它的游戏方式是把四张牌的牌面数值通过有限四则运算得到结果24,四张牌必须仅用一次.各地玩法还有点差别,有的只算1-10,其它抽出来:有的地方把整幅牌都 ...
- 【Javascript Demo】谷歌地图简单实现(附遮罩层和弹出层实现)
虽然百度地图实现了,但只是国内的,而且前几天貌似还出问题了,对于国际的只能用谷歌地图了,所以就简单研究了下,做了个差不多的. 基本步骤,谷歌地图API文档其实写的很清楚了,先获取API密钥,然后引用j ...
- linux的子进程调用exec( )系列函数
exec( )函数族 : 以下我们来看看一个进程怎样来启动还有一个程序的运行.在Linux中要使用exec函数族.系统调用execve()对当前进程进行替换,替换者为一个指定的程序,其參数包含文件名称 ...
- IE11下javascript报堆栈溢出问题的解决
在IE11浏览器下,使用日期函数里面的toLocaleDateString()会报堆栈溢出 不知道是不是跟我的其他相关代码有关,还是就是这个toLocaleDateString()在IE11确实不太一 ...
- C++生成十字绣图案(二) 面向对象
基本的十字绣线性生成中提供了判断下一步可以画的位置并且逐步生成的函数.以这些基本函数为基础,可以进行更多变化的图案设计. 为了方便的扩展,可以把线性生成写成一个类,以后的修改继承这个类. 头文件Bas ...
- PHP 表单 - 5(完整表单实例)
PHP 完整表单实例 本章节将介绍如何让用户在点击"提交(submit)"按钮提交数据前保证所有字段正确输入. PHP - 在表单中确保输入值 在用户点击提交按钮后,为确保字段值是 ...
- php之快速入门学习-13(PHP 循环 - While 循环)
PHP 循环 - While 循环 循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块. PHP 循环 在您编写代码时,您经常需要让相同的代码块一次又一次地重复运行.我们可以在代码中使用循 ...
- 包装类、object、单例模式、final、抽象类
/*包装类*/ /* byte Byte short Short int Integer long Long char Character float Float ...
- 【CMS】安装CMS
Apache和MySQL准备好后开始安装CMS 在浏览器输入:http://localhost/install/index.php即可开始安装.