当前位置: 首页 > news >正文

应用Executors来建立Thread pool

Java Gossip:Executors

有时候您需要建立一堆Thread来执行一些小任务,然而频繁的建立Thread有时会是个开销,因为Thread的建立必须与作业系统互动,如果能建立一个Thread pool来管理这些小的Thread并加以重复使用,对于系统效能会是个改善的方式。

您可以使用Executors来建立Thread pool,Executors有几个static方法,列出如下:

方法说明
newCachedThreadPool建立可以快取的Thread,每个Thread预设可idle 60秒

newFixedThreadPool

包括固定数量的Thread

newSingleThreadExecutor

只有一个Thread,循序的执行指定给它的每个任务
newScheduledThreadPool可排程的Thread
newSingleThreadScheduledExecutor单一可排程的Thread

举个简单的实例,下面的程式使用newFixedThreadPool方法建立Thread pool,当中包括五个可以重复使用的Thread,您可以指定Runnable物件给它,程式中会产生十个Runnable物件,由于Thread pool中只有五个可用的Thread,所以后来建立的五个Runnable必须等待有空闲的Thread才会被执行:
  • ExecutorDemo.java
package onlyfun.caterpillar;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExecutorDemo {
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(5);

for(int i = 0; i < 10; i++) {
final int count = i;
service.submit(new Runnable() {
public void run() {
System.out.println(count);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}

}
});
}

service.shutdown(); // 最后记得关闭Thread pool
}
}

submit()方法也接受实作Callable介面的物件,最后传回Future物件,可以取得Callable执行过后的传回结果。

如果想利用Executors进行排程,例如排定某个工作30秒后执行:
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( );
scheduler.schedule(new Runnable( ) {
public void run() {
// 排程工作
}
},
30, TimeUnit.SECONDS);


或排定某个工作5秒后执行,之后每30秒执行一次:
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( );
final ScheduledFuture future = scheduler.scheduleAtFixedRate(new Runnable( ) {
public void run() {
// 排程工作
System.out.println("t");
}
},
0, 5, TimeUnit.SECONDS);

// 排定 60 秒后取消future
scheduler.schedule(new Runnable( ) {
public void run( ) {
future.cancel(false);
}
}, 60, TimeUnit.SECONDS);



如上所示,想要取消排程任务,可以呼叫ScheduledFuture的cancel()方法。

<!-- google_ad_client = "pub-9750319131714390"; google_ad_width = 160; google_ad_height = 600; google_ad_format = "160x600_as"; google_ad_type = "text_image"; google_ad_channel = ""; //--> <iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-9750319131714390&amp;dt=1197007384156&amp;lmt=1181153050&amp;format=160x600_as&amp;output=html&amp;correlator=1197007384109&amp;url=http%3A%2F%2Fcaterpillar.onlyfun.net%2FGossipCN%2FJavaGossip-V2%2FExcutors.htm&amp;ad_type=text_image&amp;ref=http%3A%2F%2Fwww.baidu.com%2Fs%3Fie%3Dgb2312%26bs%3DExecutorService%26sr%3D%26z%3D%26cl%3D3%26f%3D8%26wd%3DExecutors%26ct%3D0&amp;cc=384&amp;ga_vid=1519114475.1197007384&amp;ga_sid=1197007384&amp;ga_hid=1360029615&amp;flash=9&amp;u_h=768&amp;u_w=1024&amp;u_ah=738&amp;u_aw=1024&amp;u_cd=32&amp;u_tz=480&amp;u_java=true" frameborder="0" width="160" scrolling="no" height="600" allowtransparency="allowtransparency"></iframe>

<!-- google_ad_client = "pub-9750319131714390"; google_ad_width = 160; google_ad_height = 600; google_ad_format = "160x600_as"; google_ad_type = "text_image"; google_ad_channel = ""; //--><iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-9750319131714390&amp;dt=1197007384187&amp;lmt=1181153050&amp;prev_fmts=160x600_as&amp;format=160x600_as&amp;output=html&amp;correlator=1197007384187&amp;url=http%3A%2F%2Fcaterpillar.onlyfun.net%2FGossipCN%2FJavaGossip-V2%2FExcutors.htm&amp;ad_type=text_image&amp;ref=http%3A%2F%2Fwww.baidu.com%2Fs%3Fie%3Dgb2312%26bs%3DExecutorService%26sr%3D%26z%3D%26cl%3D3%26f%3D8%26wd%3DExecutors%26ct%3D0&amp;cc=384&amp;ga_vid=1519114475.1197007384&amp;ga_sid=1197007384&amp;ga_hid=1360029615&amp;flash=9&amp;u_h=768&amp;u_w=1024&amp;u_ah=738&amp;u_aw=1024&amp;u_cd=32&amp;u_tz=480&amp;u_java=true" frameborder="0" width="160" scrolling="no" height="600" allowtransparency="allowtransparency"></iframe>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 富士通台式电脑_什么是电脑显卡 电脑显卡分类介绍【详解】
  • U盘上安装Damn Small Linux(DSL),让Linux常驻U盘
  • nginx 伪静态404_宝塔LNMP环境 Nginx安装EduSoho教程说明
  • c语言c99标准_C语言第一章《认识C语言》
  • robots.txt
  • java doubke类型转换为String_Java第一周笔记
  • Windows Embedded从入门到精通12月预告
  • 多个app用同一个签名文件_一文教你玩转幕布App
  • dskrdsk的区别
  • 联想杜比音效_联想锐龙入门本上市,强劲R5来了
  • 回忆Solaris_ 学习笔记1 [网络地址和掩码]
  • 边缘计算应用场景_边缘计算盒子有什么作用?博时特EC01 边缘计算盒子具体特征及应用场景来了...
  • 回忆Solaris_学习笔记2 [系统概念]
  • C# 动态 条件 组合_C# Win Form 记录集分页显示的实现
  • python 定义字符串变量_Python中什么是变量Python中定义字符串
  • Android系统模拟器绘制实现概述
  • Codepen 每日精选(2018-3-25)
  • ComponentOne 2017 V2版本正式发布
  • echarts花样作死的坑
  • ECS应用管理最佳实践
  • Java超时控制的实现
  • Java反射-动态类加载和重新加载
  • js递归,无限分级树形折叠菜单
  • Laravel Mix运行时关于es2015报错解决方案
  • Python打包系统简单入门
  • scala基础语法(二)
  • Spring Cloud中负载均衡器概览
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 构造函数(constructor)与原型链(prototype)关系
  • 基于Android乐音识别(2)
  • 力扣(LeetCode)22
  • 七牛云假注销小指南
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 项目实战-Api的解决方案
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • HanLP分词命名实体提取详解
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​secrets --- 生成管理密码的安全随机数​
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #android不同版本废弃api,新api。
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (function(){})()的分步解析
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (八)Flask之app.route装饰器函数的参数
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (转载)Linux 多线程条件变量同步
  • .net core 外观者设计模式 实现,多种支付选择
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET 指南:抽象化实现的基类