第五部分 并发工具包

并发工具包

 Java.uril.concurrent包是一套并发工具包,包含了一些有助于简化异步执行程序代码和多线程编程的工具类。下面例程拥有一个共同的特点,都是由java.uril.concurrent.Executors 来创建各种异步任务的线程池。

java.util.concurrent.ScheduledExecutorService new ScheduledThreadPool(int corePoolSize);创建容量为corePoolSize的任务计划线程池。

java.util.concurrent.ExecutorService new FixedThreadPool(int nThreads):创建固定线程数为corePoolSize的线程池。

java.util.concurrent.ExecutorService new CachedThreadPool():创建一个可根据需要创建新线程的线程池。池中已经存在的线程如果可用,那么将尽量重用它们。

任务计划线程池

java.util.concurrent.ScheduledExecutorService是任务计划线程池接口。指池中的线程并不是一开始便处于运行状态,而是在需要的时间点上由线程池管理者触发,同时允许开发人员指定多次触发的时间间隔。

下面给出代码:【TestScheduledThread

 

/** * TestScheduledThread.java * 版权所有(C) 2011 [email protected] * 创建:崔冉 2011-1-14 上午10:55:57 */ package com.cayden.thread831; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; /** * @author 崔冉 * @version 1.0.0 * @desc 并发工具包的例程 */ public class TestScheduledThread { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub final ScheduledExecutorService scheduler=Executors.newScheduledThreadPool(2); final Runnable beeper=new Runnable() { int count=0; public void run(){ System.out.println("["+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"] count="+(++count)); } }; //1秒后运行,并每隔2秒运行一次 final ScheduledFuture<?> beeperHandle=scheduler.scheduleAtFixedRate(beeper, 1, 2, TimeUnit.SECONDS); //2秒后运行,并每次在上次任务运行完后等待5秒后重新运行 final ScheduledFuture<?> beeperHandle2=scheduler.scheduleAtFixedRate(beeper, 2, 5, TimeUnit.SECONDS); //30秒后结束关闭任务,并且关闭Scheduler scheduler.schedule(new Runnable(){ public void run(){ beeperHandle.cancel(true); beeperHandle2.cancel(true); scheduler.shutdown(); } }, 30, TimeUnit.SECONDS); } }

结果是:

 

 

[2011-01-19 15:07:00] count=1 [2011-01-19 15:07:01] count=2 [2011-01-19 15:07:02] count=3 [2011-01-19 15:07:04] count=4 [2011-01-19 15:07:06] count=5 [2011-01-19 15:07:06] count=6 [2011-01-19 15:07:08] count=7 [2011-01-19 15:07:10] count=8 [2011-01-19 15:07:11] count=9 [2011-01-19 15:07:12] count=10 [2011-01-19 15:07:14] count=11 [2011-01-19 15:07:16] count=12 [2011-01-19 15:07:16] count=13 [2011-01-19 15:07:18] count=14 [2011-01-19 15:07:20] count=15 [2011-01-19 15:07:21] count=16 [2011-01-19 15:07:22] count=17 [2011-01-19 15:07:24] count=18 [2011-01-19 15:07:26] count=19 [2011-01-19 15:07:26] count=20 [2011-01-19 15:07:28] count=21

 

关于接口中的方法,大家可用参考JDK API,里面有详细介绍方法。

固定线程池

java.util.concurrent.ExecutorService接口是java.util.concurrent.ScheduledExecutorService接口的父接口,同时又是java.uril.concurrent.Executor的子接口。可用于创建固定线程池。

测试类代码【TestThreadPool

/** * TestThreadPool.java * 版权所有(C) 2011 [email protected] * 创建:崔冉 2011-1-14 下午01:52:07 */ package com.cayden.thread831; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @author 崔冉 * @version 1.0.0 * @desc */ public class TestThreadPool { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //创建容量为5的线程池 ExecutorService exec=Executors.newFixedThreadPool(5); for(int index=0;index<10;index++){ Runnable run=new Runnable() { public void run(){ long time=(long)(Math.random()*1000); System.out.println("休眠"+time+"秒"); try{ Thread.sleep(time); }catch (InterruptedException e) { // TODO: handle exception } } }; exec.execute(run); } exec.shutdown(); } }

 

 

在例子中国先后向线程池中提交了10个待执行的任务,但是线程池的总容量仅有5个线程,其中的任务分工细节完全被屏蔽,再不用开发人员操心了。可见,基于并发工具包开发线程池,能极大降低技术门槛。

运行结果:

休眠914秒 休眠736秒 休眠810秒 休眠875秒 休眠626秒 休眠320秒 休眠736秒 休眠229秒 休眠585秒 休眠593秒

缓存线程池

缓存线程池是根据需要创建新线程的线程池,如果池中已经存在的线程可用,那么将尽量重用它们。

对于需要执行很多短期异步任务的程序而言,缓存线程池通常可提高程序性能,因为长时间保持空闲的这种类型的线程池不会占用任何资源。调用缓存池对象的execute()将重用以前构造的线程。如果现有线程没有可用的,则创建一个新线程并添加到池中。 

下面代码来演示:【TestCachedThreadPool

 

/** * TestCachedThreadPool.java * 版权所有(C) 2011 [email protected] * 创建:崔冉 2011-1-14 下午02:09:58 */ package com.cayden.thread831; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @author 崔冉 * @version 1.0.0 * @desc */ public class TestCachedThreadPool { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //创建缓存线程池 ExecutorService exec=Executors.newCachedThreadPool(); for(int index=0;index<10;index++){ Runnable run=new Runnable() { public void run(){ long time=(long)(Math.random()*1000); System.out.println("休眠"+time+"秒"); try{ Thread.sleep(time); }catch (InterruptedException e) { // TODO: handle exception } } }; exec.execute(run); } exec.shutdown(); } }

运行结果:

休眠282秒 休眠134秒 休眠855秒 休眠982秒 休眠358秒 休眠480秒 休眠349秒 休眠654秒 休眠730秒 休眠135秒

你可能感兴趣的:(第五部分 并发工具包)