JDK5.0 特性-线程任务执行架构 ScheduledExecutorService
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291469.html
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提供了一个新的任务执行架构,可以轻松地高度和控制任务的执行,并且可以建立一个线程池来执行任务.
实例介绍如何使用新的任务执行架构,运行Runnable和Callable任务,包括定时执行任务,按规律执行任务和停止任务.
关键技术剖析:
使用新的任务执行框架的关键技术如下:
1.Executor服务对象是用来执行Runnable任务的,常用的方法如下:
execute方法用于执行Runnable类型的任务.
2.ExecutorService服务对象能执行和终止Callable任务,它继承了Executor,所以也能执行Runnable任务.常用的方法如下
a) submit方法用来提交Callable或Runnable任务,并返回代表此任务的Future对象.
b) invokeAll方法批处理任务集合,并返回一个代表这些任务的Future对象集合
c) shutdown方法在完成自己已提交的任务后关闭服务,不再接受新任务.
d) shutdownNow方法停止所有正在执行的任务并关闭服务.
e) isTerminated测试是否所有任务都执行完毕了
g) isShutdown测试是否该ExecutorService已被关闭
3.ScheduledExecutorService服务对象继承ExecutorService,提供了按时间安排执行任务的功能.常用的方法如下:
a)schedule(task,initDelay)方法安排所提交的Callable或Runnable任务在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();
}
}
JDK5.0 特性-线程任务执行架构 ScheduledExecutorService的更多相关文章
- JDK5.0特性-线程 Callable和Future
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291466.html import java.util.concurrent.Callable ...
- JDK5.0特性,使用ProcessBuilder执行本地命令
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.IO ...
- JDK5.0 特性-线程锁Lock
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291470.html import java.util.concurrent.Executor ...
- JDK5.0 特性线程 同步装置之CountDownLatch 同步装置之CyclicBarrier 线程 BlockingQueue
来自:http://www.cnblogs.com/taven/category/475298.html import java.util.concurrent.CountDownLatch; imp ...
- JDK5.0 特性-线程同步装置之Semaphore
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291474.html import java.util.ArrayList; import j ...
- JDK5.0 特性-线程 Condition
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291471.html import java.util.concurrent.Executor ...
- JDK5.0 特性 监控与管理虚拟机
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291465.html import java.lang.management.ClassLoa ...
- 集合框架-工具类-JDK5.0特性-函数可变参数
1 package cn.itcast.p4.news.demo; 2 3 public class ParamterDemo { 4 5 public static void main(String ...
- 集合框架-工具类-JDK5.0特性-ForEach循环
1 package cn.itcast.p4.news.demo; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 impo ...
随机推荐
- fragment做成选项卡,tab效果。 fragment+RadioGroup
fragment做成选项卡,tab效果. fragment+RadioGroup from://http://blog.csdn.net/zimo2013/article/details/122393 ...
- Linux学习15-CentOS安装mysql5.6环境
前言 在linux上安装mysql5.6版本,并远程连接mysql数据库操作 安装mysql mysql的安装可以用yum安装更方便 [root@yoyo ~]# cd /usr/local/ [ro ...
- Mac 安装zsh
1.安装zsh mac下自带zsh,但不是最新.查看zsh版本:zsh --version如果没有安装, 可以通过brew安装最新版,brew install zsh 2.安装oh-my-zsh cd ...
- 低版本系统兼容的ActionBar(七)自定义Actionbar标题栏字体
这个自定义字体其实和ActionBar有关,但之前写AtionBar的时候没考虑到修改字体样式,今天看到一篇专门写这个的文章就贴上使用方式.╮(╯▽╰)╭,不得不说Actionbar的那个样式真是让人 ...
- jetty+mongodb 配置session外部数据库存储
monbgodb简介 主页 http://www.mongodb.org/ oschina.net 介绍页 http://www.oschina.net/p/mongodb MongoDB是一个介于关 ...
- 用SLF4j/Logback打印日志-3
在 用SLF4j/Logback打印日志-1 和 用SLF4j/Logback打印日志-2 中分别介绍了Logback记录日志的基本原理并重点介绍了输出源配置.本篇介绍一些性能和技巧性的东西. 性能 ...
- WinPcap权威指南(三):ARP协议
ARP协议在局域网内使用的非常广泛,它的数据包类型分为请求包和答复包.Windows系统内部有一个缓冲区,保存了最近的ARP信息,可以在cmd下使用命令arp -a来显示目前的缓存,或者使用命令arp ...
- K3C官改固件更新frp客户端
k3c官改1.2 frpc版本是v0.13,本文介绍如何升级到最新版. 1. 下载最新版frp,发布页:https://github.com/fatedier/frp/releases选择mips版, ...
- C++中一些类和数据结构的大小的总结
针对class,虚函数等情况写了一些代码测试. #include <stdio.h> class A { }; class B { public: void f(); void g(); ...
- Android教材 | 第三章 Android界面事件处理(二)—— 杰瑞教育原创教材试读
编者按 JRedu 杰瑞教育原创系列教材将于年后与大家正式见面.为更好的借鉴读者意见,我们将会陆续地在博客园推出一系列教材试读.我们也热忱的欢迎广大博友与我们互动,提出宝贵意见. 本篇博客将推出教材 ...