JDK5.0 特性-线程任务执行架构 ScheduledExecutorService

来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291469.html

  1 import java.util.concurrent.Callable;
  2
  3 import java.util.concurrent.ExecutionException;
  4
  5 import java.util.concurrent.ExecutorService;
  6
  7 import java.util.concurrent.Executors;
  8
  9 import java.util.concurrent.Future;
 10
 11 import java.util.concurrent.ScheduledExecutorService;
 12
 13 import java.util.concurrent.TimeUnit;
 14
 15
 16
 17 /**
 18
 19     在J2SE之前启动一个任务是通过调用Thread类的start方法来实现的,任务的提交和执行是同时进行的,如果想对任务的执行进行调度,或是控制同时执行的线程数量就需要额外的编写代码来完成.
 20
 21     J2SE5.0提供了一个新的任务执行架构,可以轻松地高度和控制任务的执行,并且可以建立一个线程池来执行任务.
 22
 23     实例介绍如何使用新的任务执行架构,运行Runnable和Callable任务,包括定时执行任务,按规律执行任务和停止任务.
 24
 25 关键技术剖析:
 26
 27     使用新的任务执行框架的关键技术如下:
 28
 29     1.Executor服务对象是用来执行Runnable任务的,常用的方法如下:
 30
 31       execute方法用于执行Runnable类型的任务.
 32
 33     2.ExecutorService服务对象能执行和终止Callable任务,它继承了Executor,所以也能执行Runnable任务.常用的方法如下
 34
 35       a) submit方法用来提交Callable或Runnable任务,并返回代表此任务的Future对象.
 36
 37       b) invokeAll方法批处理任务集合,并返回一个代表这些任务的Future对象集合
 38
 39       c) shutdown方法在完成自己已提交的任务后关闭服务,不再接受新任务.
 40
 41       d) shutdownNow方法停止所有正在执行的任务并关闭服务.
 42
 43       e) isTerminated测试是否所有任务都执行完毕了
 44
 45       g) isShutdown测试是否该ExecutorService已被关闭
 46
 47     3.ScheduledExecutorService服务对象继承ExecutorService,提供了按时间安排执行任务的功能.常用的方法如下:
 48
 49       a)schedule(task,initDelay)方法安排所提交的Callable或Runnable任务在initDelay指定的时间后执行.
 50
 51       b)scheduleAtFixedRate方法安排所提交的Runnable任务按指定的间隔重复执行.
 52
 53       c)scheduleWithFixedDelay方法安排所提交的Runnable任务在每次执行完后,等待delay所指定的时间后重复执行.
 54
 55     4.Executors类用来创建各种服务对象,常用的方法如下:
 56
 57       a)callable(Runnable task)方法将Runnable的任务转化成Callable的任务.
 58
 59       b)newSingleThreadExecutor方法产生一个ExecutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用.
 60
 61       c)newCachedThreadPool方法会产生一个ExecutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用.
 62
 63       d)newFixedThreadPool(int poolSize)方法产生一个ExecutorService对象,这个对象带有一个大小为poolSize的线程池,若任务数量大于poolSize,任务会被放在一个队列里顺序执行.
 64
 65       e)newSingleThreadScheduledExecutor方法产生一个ScheduledExecutorService对象,这个对象的线程池大小为1,若任务多于一个,任务将按先后顺序执行.
 66
 67       f)newScheduledThreadPool(int poolSize)方法产生一个ScheduledExecutorService对象,这个对象的线程池大小为poolSize,若任务数量大于poolSize,任务会在一个队列里等待执行.
 68
 69 */
 70
 71 public class ExecuteArch {
 72
 73        /**该线程输出一行字符串*/
 74
 75        public static class MyThread implements Runnable{
 76
 77               public void run(){
 78
 79                      System.out.println("Task repeating. " + System.currentTimeMillis());
 80
 81                      try{
 82
 83                             Thread.sleep(1000);
 84
 85                      }catch(InterruptedException e){
 86
 87                             System.out.println("Task interrupted. " + System.currentTimeMillis());
 88
 89                      }
 90
 91               }
 92
 93        }
 94
 95        /**该Callable结束另一个任务*/
 96
 97        public static class MyCallable implements Callable{
 98
 99               private Future future;
100
101               public MyCallable(Future future){
102
103                      this.future = future;
104
105               }
106
107               public String call(){
108
109                      System.out.println("To cancell Task..." + System.currentTimeMillis());
110
111                      this.future.cancel(true);
112
113                      return "Task cancelled!";
114
115               }
116
117        }
118
119
120
121        public static void main(String... args)throwsInterruptedException,ExecutionException{
122
123               //产生一个ExcutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整
124
125               //线程执行完任务后返回线程池,供执行下一次任务使用
126
127               ExecutorService cachedService = Executors.newCachedThreadPool();
128
129               Future myThreadFuture = cachedService.submit(new MyThread());
130
131               Future myCallableFuture = cachedService.submit(newMyCallable(myThreadFuture));
132
133               System.out.println(myCallableFuture.get());
134
135               System.out.println("--------------------");
136
137
138
139               //将Runnable任务转换成 Callable任务
140
141               Callable myThreadCallable = Executors.callable(new MyThread());
142
143               Future myThreadCallableFuture = cachedService.submit(myThreadCallable);
144
145               //对于Runnable任务,转换成Callable任务后,也没有返回值
146
147               System.out.println(myThreadCallableFuture.get());
148
149               cachedService.shutdownNow();
150
151               System.out.println("--------------------");
152
153
154
155               //产生一个ExecutorService对象,这个对象带有一个大小为poolSize的线程池
156
157               //若任务大于poolSize,任务会被放在一个queue里顺序执行
158
159               ExecutorService fixedService = Executors.newFixedThreadPool(2);
160
161               fixedService.submit(new MyThread());
162
163               fixedService.submit(new MyThread());
164
165               //由于线程池大小为2,所以后面的任务必须等待前面的任务执行完毕后才能被执行
166
167               myThreadFuture = fixedService.submit(new MyThread());
168
169               myThreadFuture = fixedService.submit(new MyCallable(myThreadFuture));
170
171               System.out.println(myCallableFuture.get());
172
173               fixedService.shutdown();
174
175               System.out.println("--------------------");
176
177
178
179               //产生一个ScheduleExecutorService对象,这个对象的线程池大小为poolSize
180
181               //若任务数量大于poolSize,任务会在一个queue里等待执行
182
183               ScheduledExecutorService fixedScheduledService = Executors.newScheduledThreadPool(2);
184
185               MyThread task1 = new MyThread();
186
187               //使用任务执行服务立即执行任务1,而且此后每隔2秒执行一次任务1
188
189               myThreadFuture = fixedScheduledService.scheduleAtFixedRate(task1, 0, 2, TimeUnit.SECONDS);
190
191               MyCallable task2 = new MyCallable(myThreadFuture);
192
193               //使用任务执行服务等待5秒后执行任务2,执行它后将任务1关闭.
194
195               myCallableFuture = fixedScheduledService.schedule(task2,5,TimeUnit.SECONDS);
196
197               System.out.println(myCallableFuture.get());
198
199               fixedScheduledService.shutdownNow();
200
201        }
202
203 }

JDK5.0 特性-线程任务执行架构 ScheduledExecutorService

时间: 2024-10-05 10:14:13

JDK5.0 特性-线程任务执行架构 ScheduledExecutorService的相关文章

JDK5.0 特性-线程锁Lock

来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291470.html 1 import java.util.concurrent.ExecutorService; 2 3 import java.util.concurrent.Executors; 4 5 import java.util.concurrent.Future; 6 7 import java.util.concurrent.locks.Lock; 8 9 import j

JDK5.0特性-线程 Callable和Future

来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291466.html 1 import java.util.concurrent.Callable; 2 3 import java.util.concurrent.ExecutorService; 4 5 import java.util.concurrent.Executors; 6 7 import java.util.concurrent.Future; 8 9 10 11 /**

JDK5.0 特性线程 同步装置之CountDownLatch 同步装置之CyclicBarrier 线程 BlockingQueue

来自:http://www.cnblogs.com/taven/category/475298.html 1 import java.util.concurrent.CountDownLatch; 2 import java.util.concurrent.ExecutorService; 3 import java.util.concurrent.Executors; 4 5 /** 6 * CountDownLatch维护一个计数器,等待这个CountDownLatch的线程必须等到计数器为

JDK5.0 特性-线程同步装置之Semaphore

来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291474.html 1 import java.util.ArrayList; 2 3 import java.util.concurrent.ExecutorService; 4 5 import java.util.concurrent.Executors; 6 7 import java.util.concurrent.Semaphore; 8 9 import java.util.

JDK5.0 特性-线程 Condition

来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291471.html 1 import java.util.concurrent.ExecutorService; 2 3 import java.util.concurrent.Executors; 4 5 import java.util.concurrent.locks.Condition; 6 7 import java.util.concurrent.locks.Lock; 8 9

JDK5.0特性,使用ProcessBuilder执行本地命令

1 import java.io.BufferedReader; 2 3 import java.io.BufferedWriter; 4 5 import java.io.File; 6 7 import java.io.IOException; 8 9 import java.io.InputStream; 10 11 import java.io.InputStreamReader; 12 13 import java.io.OutputStreamWriter; 14 15 import

day07 MyEclipse 安装 jdk5.0 新特性

1.myeclipse的安装和使用 * eclipse:是一个免费的开发工具    * myeclipse:是一个收费的插件,破解myeclipse,        ** 安装目录的要求: 不能有中文和空格        ** 安装完成之后,选择一个工作空间 ,这个工作空间不能有中文和空格    * 破解myeclipse        ** 运行run.bat文件,但是运行之前,必须要安装jdk,通过配置环境变量 * myeclipse的使用        * 创建一个工程          

Day07 jdk5.0新特性&Junit&反射

day07总结 今日内容 MyEclipse安装与使用 JUnit使用 泛型 1.5新特性 自动装箱拆箱 增强for 静态导入 可变参数方法 枚举 反射 MyEclipse安装与使用(yes) 安装MyEclipse 先安装了JDK ? MyEclipse介绍 ? MyEclipse是Eclipse的一个插件: MyEclipse是需要花钱的: MyEclipse官网不在欢迎中国人登录: ? MyEclipse使用 ? 1 创建项目 选择工作空间: 工作空间路径不能有空格和中文: 工作空间以班名

Java JDK5.0新特性

JDK5.0新特性 虽然JDK已经到了1.8 但是1.5(5.0)的变化是最大的 1. 增强for循环 foreach语句 foreach简化了迭代器 作用: 对存储对象的容器进行迭代 (数组, collection, map) 1> 格式 增强for循环括号里写两个参数 第一个是声明一个变量 第二个就是需要迭代的容器 for( 元素类型 变量名 : Collection集合 & 数组 ) { ... } 2> 增强for循环和传统for循环的区别 a. 增强for循环在使用时 必须要