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 ... 
随机推荐
- IllegalStateException: Can not perform this action after onSaveInstanceState
			http://www.cnblogs.com/zgz345/archive/2013/03/04/2942553.html 今天使用Fragment的时候,出现了这个错误 IllegalStateEx ... 
- itunes connect 改版后无法访问的处理办法
			很悲剧,今天要提交版本,结果itunes connect改版,然后进不去了, 限于无限loading- 是网速慢吗?再等等,先吃个饭,待会再来看- ------------------------ ... 
- Asp.Net 管道事件注册/HttpApplication事件注册
			一.HttpApplication简介 在HttpRuntime创建了HttpContext对象之后,HttpRuntime将随后创建一个用于处理请求的对象,这个对象的类型为HttpApplicati ... 
- HTML5 浏览器返回按钮/手机返回按钮事件监听
			1.HTML5 History对象 支持使用pushState()方法修改地址栏地址,而不刷新页面. popstate事件 当history实体被改变时,popstate事件将会发生.调用pushS ... 
- PHP Curl实例
			URL Link : http://www.groad.net/bbs/forum-115-1.html 
- apache+jetty 配置web jsp服务器负载均衡
			首先,查找中文资料,貌似很少,有一个网友写了点,但是1版本过老,2有些地方有错误. 经过我自己摸索,记录一下.这个图很简洁明了 第一阶段 ,配置jetty 首先从 http://download.ec ... 
- 开闭原则(Open Closed Principle,OCP)
			遵循开闭原则设计出的模块具有两个主要特征: 对于扩展是开放的(Open for extension).这意味着模块的行为是可以扩展的.当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的 ... 
- 【转】Redis 总结精讲 看一篇成高手系统-4
			https://www.cnblogs.com/rjzheng/p/9096228.html 本文围绕以下几点进行阐述 1.为什么使用redis2.使用redis有什么缺点3.单线程的redis为什么 ... 
- Linux修改终端显示前缀及环境变量
			Linux终端前面默认显示一长串,如: [work@aaa.baidu.com dir]$ 这是由PS1环境变量决定的: [work@aaa.baidu.com dir]$ echo $PS1 [\u ... 
- hadoop集群默认配置和常用配置
			http://www.cnblogs.com/ggjucheng/archive/2012/04/17/2454590.html 获取默认配置 配置hadoop,主要是配置core-site.xml, ... 
