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

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

  1. JDK5.0特性-线程 Callable和Future

    来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291466.html import java.util.concurrent.Callable ...

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

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.IO ...

  3. JDK5.0 特性-线程锁Lock

    来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291470.html import java.util.concurrent.Executor ...

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

    来自:http://www.cnblogs.com/taven/category/475298.html import java.util.concurrent.CountDownLatch; imp ...

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

    来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291474.html import java.util.ArrayList; import j ...

  6. JDK5.0 特性-线程 Condition

    来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291471.html import java.util.concurrent.Executor ...

  7. JDK5.0 特性 监控与管理虚拟机

    来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291465.html import java.lang.management.ClassLoa ...

  8. 集合框架-工具类-JDK5.0特性-函数可变参数

    1 package cn.itcast.p4.news.demo; 2 3 public class ParamterDemo { 4 5 public static void main(String ...

  9. 集合框架-工具类-JDK5.0特性-ForEach循环

    1 package cn.itcast.p4.news.demo; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 impo ...

随机推荐

  1. 【python】python编码方式,chardet编码识别库

    环境: python3.6 需求: 针对于打开一个文件,可以读取到文本的编码方式,根据默认的文件编码方式来获取文件,就不会出现乱码. 针对这种需求,python中有这个方式可以很好的解决: 解决策略: ...

  2. 在Activity中使用Thread导致的内存泄漏

    https://github.com/bboyfeiyu/android-tech-frontier/tree/master/issue-7/%E5%9C%A8Activity%E4%B8%AD%E4 ...

  3. Android:调用其他程序中的activity和Permission Denial: starting Intent 错误解决办法

    今天想调试多个task中栈的情况,在测试程序中调用另一个程序的activity, 代码片段如下: btnStartX=(Button)findViewById(R.id.btnStartX); btn ...

  4. 【linux c】setsockopt 详解

    转自:http://blog.csdn.net/zhonglinzhang/article/details/9183229 功能描述:        获取或者设置与某个套接字关联的选 项.选项可能存在 ...

  5. SharePoint Online 创建文档库

    前言 本文介绍如何在Office 365中创建文档库,以及文档库的一些基本设置. 正文 通过登录地址登录到Office 365的SharePoint Online站点中,我们可以在右上角的设置菜单中, ...

  6. Android之防止反编译技巧

    1. 判断程序是否运行在模拟器上 boolean isRunningInEmualtor() { boolean qemuKernel = false; Process process = null; ...

  7. C#多线程读写同一文件处理

    在多线程访问读写同一个文件时,经常遇到异常:“文件正在由另一进程使用,因此该进程无法访问此文件”. 多线程访问统一资源的异常, 解决方案1,保证读写操作单线程执行,可以使用lock 解决方案2,使用S ...

  8. Matlab中使用LaTeX

    Matlab作为数据计算和处理的数学语言(软件),而LaTex作为出版界的重要排版语言(软件),尤其是对数学公式的排版功能特别强.在Matlab中有两种方法使用LaTeX:1)对Matlab生成的图形 ...

  9. Zookeeper Tutorial 2 -- Programmer's Guide

    数据模型 ZooKeeper跟分布式文件系统一样, 有一系列的命名空间. 唯一不同的地方是命名空间中的每个节点都有数据和他相关联. 它类似于一个允许文件同时是一个目录的文件系统. 节点的路径永远是以斜 ...

  10. java-nio之zero copy深入分析

    对于所有的io操作,底层一定是调用操作系统的api来进行读写.受限于不同的操作系统,操作方式一定是有差异的.以下read和write操作,可以看做服务器从磁盘硬件上读取文件数据,然后通过socket发 ...