在Java 5.0之前启动一个任务是通过调用Thread类的start()方法来实现的,任务的提于交和执行是同时进行的,如果你想对任务的执行进行调度或是控制 同时执行的线程数量就需要额外编写代码来完成。5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行,并且可以建立一个类似数据库连接 池的线程池来执行任务。这个架构主要有三个接口和其相应的具体类组成。这三个接口是Executor, ExecutorService、ScheduledExecutorService,让我们先用一个图来显示它们的关系:
图的左侧是接口,图的右侧是这些接口的具体类。注意Executor是没有直接具体实现的。
Executor接口:是用来执行Runnable任务的,它只定义一个方法:
•execute(Runnable command):执行Ruannable类型的任务
ExecutorService接口:ExecutorService继承了Executor的方法,并提供了执行Callable任务和中止任务执行的服务,其定义的方法主要有:
•submit(task):可用来提交Callable或Runnable任务,并返回代表此任务的Future对象
•invokeAll(collection of tasks):批处理任务集合,并返回一个代表这些任务的Future对象集合
•shutdown():在完成已提交的任务后关闭服务,不再接受新任务
•shutdownNow():停止所有正在执行的任务并关闭服务。
•isTerminated():测试是否所有任务都执行完毕了。
•isShutdown():测试是否该ExecutorService已被关闭
ScheduledExecutorService接口在ExecutorService的基础上,ScheduledExecutorService提供了按时间安排执行任务的功能,它提供的方法主要有:
•schedule(task, initDelay): 安排所提交的Callable或Runnable任务在initDelay指定的时间后执行。
•scheduleAtFixedRate():安排所提交的Runnable任务按指定的间隔重复执行
•scheduleWithFixedDelay():安排所提交的Runnable任务在每次执行完后,等待delay所指定的时间后重复执行。
重要的Executors类
虽然以上提到的接口有其实现的具体类,但为了方便Java 5.0建议使用Executors的工具类来得到Executor接口的具体对象,需要注意的是Executors是一个类,不是Executor的复数 形式。Executors提供了以下一些static的方法:
•callable(Runnable task):将Runnable的任务转化成Callable的任务
•newSingleThreadExecutor:产生一个ExecutorService对象,这个对象只有一个线程可用来执行任务,若任务多于一个,任务将按先后顺序执行。
•newCachedThreadPool():产生一个ExecutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用。
•newFixedThreadPool(int poolSize):产生一个ExecutorService对象,这个对象带有一个大小为poolSize的线程池,若任务数量大于poolSize,任务会被放在一个queue里顺序执行。
•newSingleThreadScheduledExecutor:产生一个ScheduledExecutorService对象,这个对象的线程池大小为1,若任务多于一个,任务将按先后顺序执行。
•newScheduledThreadPool(int poolSize):产生一个ScheduledExecutorService对象,这个对象的线程池大小为poolSize,若任务数量大于poolSize,任务会在一个queue里等待执行
举例说明:
应用Executors来建立Thread pool
有时候您需要建立一堆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秒执行一次:
复制代码 代码如下:
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()方法。
相关推荐:
ChatGPT网页版内容显示不全的解决方案:如何轻松解决问题?,课件ai
SEO自己:打造属于你的数字营销利器,微信裂变营销推广软件
内容创作新时代:自动生成文章的AI如何改变写作生态
ChatGPT不能打开EL?揭秘这一困扰背后的真相与解决方案,ai被动房
ChatGPT免费版的限制:你需要了解的5大制约因素,Ai分解模型
SEO工装裤-打造时尚与实用兼备的工作利器,ai画中国爸爸辅导孩子写作业
seo需要什么器械,seo需要什么器械才能做 ,长续航ai纯电汽车
AI自动帮写,轻松应对内容创作挑战,赋能写作新未来,嘿科技ai
seo链接锚是什么,什么是锚链接,如何设置锚链接 ,保山智能AI
seo要学什么技术,seo要学什么技术好 ,ai.fale
AI助手推进:智能化时代的企业革命,ai改变图片颜色
seo运营经理是什么,seo和运营的区别 ,皖妍ai宁慕晴o
SEO项目指的是什么,seo项目指的是什么意思 ,写个ai
ChatGPT中文版下载免费版:智能对话新时代,尽在,ai光波
ChatGPT打不开了吗?如何快速解决常见问题,恢复顺畅体验!,ai13212511845
ChatGPT发生故障,背后隐藏着哪些不为人知的原因与挑战?,硬件ai和软件ai
seo灰帽是什么,灰帽是指什么 ,ai绘画六边形
ChatGPT网站突然不能用了?如何快速解决这个问题,让你重新畅享AI对话!,ai新建多个画板
seo监控什么意思,seo数据监控 ,ai panda眼镜架
ChatGPT出现错误503?你需要知道的解决方案和应对策略,ai拉伸字效
AI免费写文章生成器高效写作新革命
【BVIP尊享体验:超越奢华,开启专属未来】,珠宝网站建设思路
ChatGPT服务器坏了?了解背后的技术与应对策略,AI模块代表
用AI征文工具,轻松创作出精彩文章!
文章续写AI:提升写作效率,创意无限
SEO更多-让你的企业站点在搜索引擎中脱颖而出,如何结交seo大神
ChatGPT使用问题?如果您正在使用VPN,请尝试将其关闭,ai制作渐变立体
AI智能工具的无限可能:未来已来,你准备好了吗?
seo黑帽是什么,列举几种seo黑帽行为 ,穿老款的ai丢人吗
SEO能够助力网站流量增长,提升品牌竞争力,Seo网站排名原理
为什么做抖音seo,为什么做抖音推广 ,描边ai虚线
SEO前的准备工作:如何让网站为搜索引擎优化做好充分准备,SEO_网站排名优化_网络推广
SEO动态:2025年SEO趋势与优化技巧解析,十堰外贸网站推广费用
SEO监控:精准把握网站排名与优化成效的利器,湖南seo排名商家名单
重生成AI:突破科技前沿,开启智能未来
SEO立刻:快速提升网站排名,带你走在搜索引擎前沿,网站建设怎么推广好做
SEO舆情:如何通过有效的舆情管理提升企业品牌形象,seo推广外包提高收录
SEO优化排名:让您的网站在搜索引擎中脱颖而出,我ai 达瓦仓决
OpenPose大白话解释:让你轻松理解姿态识别的神奇技术,ai天天晴
AI写作技巧,让创作事半功倍!
ChatGPT-深度学习与自然语言处理的革命性突破,金华ai视觉锁螺丝机
SEO优化全攻略提升网站排名的关键步骤与未来趋势,这是什么新晋动画ai
优化入口:提升网站流量与转化率的秘密武器,琼海关键词排名品牌
seo菲律宾是做什么,菲律宾网址排名 ,openl ai
什么是SEO优化方案,seo的优化方案 ,ai emorobot
SEO收集:如何通过有效数据收集提升网站排名,鞍山商城网站建设报价
ChatGPT无服务:如何突破限制,未来人工智能的新可能,ai绘制装饰画
ChatGPT安装包Windows版-让智能助手触手可得,q和ai
ChatGPT进不去怎么办?解决方案与技巧,轻松畅享智能对话,ai va
企业营销:如何在竞争激烈的市场中脱颖而出,美装网站Seo优化