JDK5.0新特性系列---11.2线程 任务执行架构

简介:

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Future;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

/**

J2SE之前启动一个任务是通过调用Thread类的start方法来实现的,任务的提交和执行是同时进行的,如果想对任务的执行进行调度,或是控制同时执行的线程数量就需要额外的编写代码来完成.

J2SE5.0提供了一个新的任务执行架构,可以轻松地高度和控制任务的执行,并且可以建立一个线程池来执行任务.

实例介绍如何使用新的任务执行架构,运行RunnableCallable任务,包括定时执行任务,按规律执行任务和停止任务.

关键技术剖析:

使用新的任务执行框架的关键技术如下:

1.Executor服务对象是用来执行Runnable任务的,常用的方法如下:

execute方法用于执行Runnable类型的任务.

2.ExecutorService服务对象能执行和终止Callable任务,它继承了Executor,所以也能执行Runnable任务.常用的方法如下

a) submit方法用来提交CallableRunnable任务,并返回代表此任务的Future对象.

b) invokeAll方法批处理任务集合,并返回一个代表这些任务的Future对象集合

c) shutdown方法在完成自己已提交的任务后关闭服务,不再接受新任务.

d) shutdownNow方法停止所有正在执行的任务并关闭服务.

e) isTerminated测试是否所有任务都执行完毕了

g) isShutdown测试是否该ExecutorService已被关闭

3.ScheduledExecutorService服务对象继承ExecutorService,提供了按时间安排执行任务的功能.常用的方法如下:

a)schedule(task,initDelay)方法安排所提交的CallableRunnable任务在initDelay指定的时间后执行.

b)scheduleAtFixedRate方法安排所提交的Runnable任务按指定的间隔重复执行.

c)scheduleWithFixedDelay方法安排所提交的Runnable任务在每次执行完后,等待delay所指定的时间后重复执行.

4.Executors类用来创建各种服务对象,常用的方法如下:

a)callable(Runnable task)方法将Runnable的任务转化成Callable的任务.

b)newSingleThreadExecutor方法产生一个ExecutorService对象,这个对象带有一个线程,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用.

c)newCachedThreadPool方法会产生一个ExecutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用.

d)newFixedThreadPool(int poolSize)方法产生一个ExecutorService对象,这个对象带有一个大小为poolSize的线程池,若任务数量大于poolSize,任务会被放在一个队列里顺序执行.

e)newSingleThreadScheduledExecutor方法产生一个ScheduledExecutorService对象,个对象的线程池大小为1,若任务多于一个,任务将按先后顺序执行.

f)newScheduledThreadPool(int poolSize)方法产生一个ScheduledExecutorService,这个对象的线程池大小为poolSize,若任务数量大于poolSize,任务会在一个队列里等待执行.

*/

public class ExecuteArch {

/**该线程输出一行字符串*/

public static class MyThread implements Runnable{

public void run(){

System.out.println("Task repeating. " + System.currentTimeMillis());

try{

Thread.sleep(1000);

}catch(InterruptedException e){

System.out.println("Task interrupted. " + System.currentTimeMillis());

}

}

}

/**Callable结束另一个任务*/

public static class MyCallable implements Callable{

private Future future;

public MyCallable(Future future){

this.future = future;

}

public String call(){

System.out.println("To cancell Task..." + System.currentTimeMillis());

this.future.cancel(true);

return "Task cancelled!";

}

}

public static void main(String... args)throwsInterruptedException,ExecutionException{

//产生一个ExcutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整

//线程执行完任务后返回线程池,供执行下一次任务使用

ExecutorService cachedService = Executors.newCachedThreadPool();

Future myThreadFuture = cachedService.submit(new MyThread());

Future myCallableFuture = cachedService.submit(newMyCallable(myThreadFuture));

System.out.println(myCallableFuture.get());

System.out.println("--------------------");

//Runnable任务转换成 Callable任务

Callable myThreadCallable = Executors.callable(new MyThread());

Future myThreadCallableFuture = cachedService.submit(myThreadCallable);

//对于Runnable任务,转换成Callable任务后,也没有返回值

System.out.println(myThreadCallableFuture.get());

cachedService.shutdownNow();

System.out.println("--------------------");

//产生一个ExecutorService对象,这个对象带有一个大小为poolSize的线程池

//若任务大于poolSize,任务会被放在一个queue里顺序执行

ExecutorService fixedService = Executors.newFixedThreadPool(2);

fixedService.submit(new MyThread());

fixedService.submit(new MyThread());

//由于线程池大小为2,所以后面的任务必须等待前面的任务执行完毕后才能被执行

myThreadFuture = fixedService.submit(new MyThread());

myThreadFuture = fixedService.submit(new MyCallable(myThreadFuture));

System.out.println(myCallableFuture.get());

fixedService.shutdown();

System.out.println("--------------------");

//产生一个ScheduleExecutorService对象,这个对象的线程池大小为poolSize

//若任务数量大于poolSize,任务会在一个queue里等待执行

ScheduledExecutorService fixedScheduledService = Executors.newScheduledThreadPool(2);

MyThread task1 = new MyThread();

//使用任务执行服务立即执行任务1,而且此后每隔2秒执行一次任务1

myThreadFuture = fixedScheduledService.scheduleAtFixedRate(task1, 0, 2, TimeUnit.SECONDS);

MyCallable task2 = new MyCallable(myThreadFuture);

//使用任务执行服务等待5秒后执行任务2,执行它后将任务1关闭.

myCallableFuture = fixedScheduledService.schedule(task2,5,TimeUnit.SECONDS);

System.out.println(myCallableFuture.get());

fixedScheduledService.shutdownNow();

}

}




本文转自远哥博客园博客,原文链接:http://www.cnblogs.com/taven/archive/2011/12/17/2291469.html,如需转载请自行联系原作者

相关文章
|
20天前
|
机器学习/深度学习 安全 算法
十大主流联邦学习框架:技术特性、架构分析与对比研究
联邦学习(FL)是保障数据隐私的分布式模型训练关键技术。业界开发了多种开源和商业框架,如TensorFlow Federated、PySyft、NVFlare、FATE、Flower等,支持模型训练、数据安全、通信协议等功能。这些框架在灵活性、易用性、安全性和扩展性方面各有特色,适用于不同应用场景。选择合适的框架需综合考虑开源与商业、数据分区支持、安全性、易用性和技术生态集成等因素。联邦学习已在医疗、金融等领域广泛应用,选择适配具体需求的框架对实现最优模型性能至关重要。
280 79
十大主流联邦学习框架:技术特性、架构分析与对比研究
|
30天前
|
存储 消息中间件 druid
Druid 架构原理及核心特性详解
Druid 是一个分布式、支持实时多维OLAP分析的列式存储数据处理系统,适用于高速实时数据读取和灵活的多维数据分析。它通过Segment、Datasource等元数据概念管理数据,并依赖Zookeeper、Hadoop和Kafka等组件实现高可用性和扩展性。Druid采用列式存储、并行计算和预计算等技术优化查询性能,支持离线和实时数据分析。尽管其存储成本较高且查询语言功能有限,但在大数据实时分析领域表现出色。
115 19
|
30天前
|
存储 缓存 监控
ClickHouse 架构原理及核心特性详解
ClickHouse 是由 Yandex 开发的开源列式数据库,专为 OLAP 场景设计,支持高效的大数据分析。其核心特性包括列式存储、字段压缩、丰富的数据类型、向量化执行和分布式查询。ClickHouse 通过多种表引擎(如 MergeTree、ReplacingMergeTree、SummingMergeTree)优化了数据写入和查询性能,适用于电商数据分析、日志分析等场景。然而,它在事务处理、单条数据更新删除及内存占用方面存在不足。
304 21
|
30天前
|
存储 SQL NoSQL
Doris 架构原理及核心特性详解
Doris 是百度内部孵化的OLAP项目,现已开源并广泛应用。它采用MPP架构、向量化执行引擎和列存储技术,提供高性能、易用性和实时数据处理能力。系统由FE(管理节点)和BE(计算与存储节点)组成,支持水平扩展和高可用性。Doris 适用于海量数据分析,尤其在电商、游戏等行业表现出色,但资源消耗较大,复杂查询优化有局限性,生态集成度有待提高。
92 15
|
1月前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
109 17
|
2月前
|
弹性计算 运维 Serverless
卓越效能,极简运维,体验Serverless高可用架构,完成任务可领取转轮日历!
卓越效能,极简运维,体验Serverless高可用架构,完成任务可领取转轮日历!
|
2月前
|
机器学习/深度学习 编解码 人工智能
超越Transformer,全面升级!MIT等华人团队发布通用时序TimeMixer++架构,8项任务全面领先
一支由麻省理工学院、香港科技大学(广州)、浙江大学和格里菲斯大学的华人研究团队,开发了名为TimeMixer++的时间序列分析模型。该模型在8项任务中超越现有技术,通过多尺度时间图像转换、双轴注意力机制和多尺度多分辨率混合等技术,实现了性能的显著提升。论文已发布于arXiv。
205 84
|
2月前
|
容器
jdk8新特性-详情查看文档
jdk8新特性-详情查看文档
66 7
|
3月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
76 12
|
3月前
|
消息中间件 监控 Java
线程池关闭时未完成的任务如何保证数据的一致性?
保证线程池关闭时未完成任务的数据一致性需要综合运用多种方法和机制。通过备份与恢复、事务管理、任务状态记录与恢复、数据同步与协调、错误处理与补偿、监控与预警等手段的结合,以及结合具体业务场景进行分析和制定策略,能够最大程度地确保数据的一致性,保障系统的稳定运行和业务的顺利开展。同时,不断地优化和改进这些方法和机制,也是提高系统性能和可靠性的重要途径。
143 62