来自: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的更多相关文章

  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. Android_开源框架_AndroidUniversalImageLoader网络图片加载

    1.功能概要 Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示. (1).使用多线程加载图片(2) ...

  2. maven + sonar, gradle + sonar

    sonar installation and configuration Download sonar http://downloads.sonarsource.com/sonarqube/ Deco ...

  3. [wxWidgets]_[0基础]_[不常见但有用的类wxStandardPaths]

    场景: 1.wxStandardPaths   用来获取各种系统路径.能够用于存放app的配置数据.比方文档文件夹,appData等. 代码: #include "wx/wxprec.h&q ...

  4. SearchView的最简单的使用方式

    SearchView顾名思义就是一个搜索视图,和之前讲解的自动匹配的输入框类似.只不过他有自己特有的监听器,并且可以实时得到用户输入的结果.对于SearchView这个控件,我强烈建议将其放在Acti ...

  5. Variational Inference

    作者:孙九爷链接:https://www.zhihu.com/question/41765860/answer/101915528来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  6. Http请求中Content-Type讲解以及在Spring MVC注解中produce和consumes配置详解

    原文地址:  https://blog.csdn.net/shinebar/article/details/54408020 引言: 在Http请求中,我们每天都在使用Content-type来指定不 ...

  7. mysql 5.1简明教程

    第一章Mysql简介与安装 第一节 MySql简介 百度百科 第二节 MySql安装与配置 1.MySql5.1下载及安装 2.MySql数据库编码配置 UTF-8 3.MySql图形页面sqlyog ...

  8. Spring Boot集成JasperReports生成PDF文档

    由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲染生成PDF文档.本人文采欠缺,写作能力 ...

  9. python3 IEDriver抓取时报数据

    最近做了测试抓取XX时报的数据,由于需要事先登录,并且有验证码,关于验证码解决有两个途径:一是利用打码平台,其原理是把验证码的图片上传发送给打码平台, 然后返回其验证码.二就是自己研究验证码技术问题. ...

  10. Android -- com.android.providers.media,external.db

    external.db android是管理多媒体文件(音频.视频.图片)的信息是在/data/data/com.android.providers.media下的数据库文件external.db. ...