当我们的应用程序需要处理大量单个执行时间较短的任务时,就应该考虑使用线程池,这是因为系统创建和销毁线程池也需要时间和资源。JDK1.5提供了一个很好的线程池实现类,下面通过一个简单的例子来演示下如何利用该类建立线程池。
1.TestThreadPool 类
import java.util.concurrent.*; //线程池的实现类所在的包。
public class TestThreadPool {
private static delayTime = 25;
public static void main(String[] args) {
// 构造一个线程池
ThreadPoolExecutor pool = new ThreadPoolExecutor(5, 10, 0,
TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(50),
new ThreadPoolExecutor.DiscardPolicy());
//第1个参数表示最少开启多少线程
//第2个参数表示最多开启多少线程
//第3个参数表示线程池维护线程所允许的空闲时间
//第4个参数表示线程池维护线程所允许的空闲时间单位
//第5个参数用来存放我们的任务序列的有序队列
//第6个参数表示当队列满时采取的策略,有4个策略:1.AbortPolicy() 抛出java.util.concurrent.RejectedExecutionException异常2.CallerRunsPolicy() 由调用者执行这个任务3.DiscardOldestPolicy() 抛弃旧的任务4.DiscardPolicy() 抛弃当前的任务
// 每隔delayTime 的时间向线程池派送一个任务。
int i = 1;
while (true) {
try {
Thread.sleep(delayTime );
String work= "work@" +( i++);
System.out.println("put " +work);
pool .execute(new WorkFlow(work));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
2.WorkFlow类
public class WorkFlow implements Runnable{
private static int delayTime = 500;
private Object workID;
WorkFlow (Object work) {
this.workID= work;
}
public void run() {
System.out.println("now run:"+workID);
try {
// 模拟业务,啥都不做,睡一段时间
Thread.sleep(delayTime );
} catch (Exception e) {
e.printStackTrace();
}
workID= null;
}
}
通过修改2个delayTime的时间,可以模拟出高并发和多任务的环境,然后观察控制台输出结果,试着改变队列满时的策略,可是观察到不同的现象。