在JDK1.5之前,对高质量Java多线程并发程序设计时,为防止程序崩掉等现象的出现,比如使用wait()、notify()和synchronized等,需要考虑性能、死锁、公平性、资源管理以及如何避免线程安全性方面带来的危害等诸多因素,通常会采用一些较为复杂的安全策略,加重了程序员的开发负担。在JDK1.5出现之后,大牛Doug Lee编写了java.util.concurrent java并发工具包,开发者利用此包,可大大提高并发程序的开发效率,并且能有效防止资源竞争、状态一致和避免死锁。java.util.concurrent包分成了三个部分,分别是java.util.concurrent、java.util.concurrent.atomic和java.util.concurrent.locks。内容涵盖了并发集合类、线程池机制、同步互斥机制、线程安全的变量更新工具类、锁等常用工具。
1) java.util.concurren:其主要的接口和类有Executor、Executors、ExecutorService、Callable、Future和BlockingQueue,这6个接口和类可如下理解:
﹒Executor:具体Runnable任务的执行者;
﹒Executors:提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口;
﹒ExecutorService:扩展了Executor并添加了一些生命周期管理的方法。一个ExecutorService的生命周期有三种状态:运行、关闭和终止。ExecutorService创建时处于运行状态,当调用ExecutorService.shutdown()后处于关闭状态,所有已添加的任务执行完毕后ExecutorService处于终止状态;
﹒Future:是与Runnable,Callable进行交互的接口,比如一个线程执行结束后取返回的结果等等,还提供了cancel终止线程;
﹒BlockingQueue:阻塞队列。
表格所示为代码示例:
package com.thread.test.concurent;
import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; import java.util.concurrent.RejectedExecutionException;
import junit.framework.TestCase;
/** * * <p>Description:concurrent包Executors,ExecutorService等的简单应用Case</p> * @author 乡台瑞猿 * @version $Id: ExecutorTest.java,v 0.1 Feb 21, 2010 4:09:59 PM Exp $ */ public class ExecutorTest extends TestCase{
/** * <p>Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。 * Executor.execute(Runnalbe),Executor在执行时使用内部的线程池完成操作</p> * @author 乡台瑞猿 * @date Feb 21, 2010 4:12:28 PM */ public void ftestExecutor(){ Executor executor = Executors.newFixedThreadPool(10); System.out.println(); System.out.println("Test case: "+this.getName()); Runnable task = new Runnable() { public void run() { System.out.println("Exceutor exec runable."); } }; executor.execute(task);
/****************执行结果**************** *Test case: testExecutor *Exceutor exec runable. * *************************************/ }
/** * <p>扩展了Executor并添加了一些生命周期管理的方法。一个ExecutorService的生命周期有三种状态: * 运行、关闭和终止。ExecutorService创建时处于运行状态,当调用ExecutorService.shutdown() * 后处于关闭状态,所有已添加的任务执行完毕后ExecutorService处于终止状态</p> * @author 乡台瑞猿 * @date Feb 21, 2010 4:44:41 PM */ public void ftestExecutorService(){ Executor executor = Executors.newFixedThreadPool(10); ExecutorService executorService = (ExecutorService) executor; // System.out.println(); System.out.println("Test case: "+this.getName()); Runnable task = new Runnable() { public-->
|