JDK5 Executor执行器的应用
JDK5新增了一个软件包java.util.concurrent,提供了大量在并发编程中很常用的实用工具类。
java.util.concurrent.Executor是一个执行器。用来执行已提交的 Runnable 任务的对象。
Executor本身是一个接口。此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。通常使用 Executor 而不是显式地创建线程。
通过Executor管理Thread对象,可以简化编程。
Executor在客户单和任务执行之间提供了一个中介层,通过中介来执行任务。Executor执行任务而无须管理任务的生命周期。因此,Executor是启动任务的首选方法。
在官方的API文档中给出了非常详细的应用例子。
java.util.concurrent.Executors工具类是创建线程池的工具类。
下面看看如何使用线程池通过Executor来执行多线程任务:
package stu.executor;
/**
* 一个实现了Runnable接口的任务
*
* @author leizhimin,2008-10-9 10:48:39
*/
public class TestTask implements Runnable {
private String taskName;
public TestTask(String taskName) {
this.taskName = taskName;
}
public void run() {
//一个比较耗时的工作
for ( int i = 0; i < 9999999; i++) ;
System.out.println( "执行 " + taskName + " ,所在线程ID为:" + Thread.currentThread().getId());
}
}
/**
* 一个实现了Runnable接口的任务
*
* @author leizhimin,2008-10-9 10:48:39
*/
public class TestTask implements Runnable {
private String taskName;
public TestTask(String taskName) {
this.taskName = taskName;
}
public void run() {
//一个比较耗时的工作
for ( int i = 0; i < 9999999; i++) ;
System.out.println( "执行 " + taskName + " ,所在线程ID为:" + Thread.currentThread().getId());
}
}
package stu.executor;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
/**
* 定时器测试
*
* @author leizhimin,2008-10-9 10:48:32
*/
public class TestExecutor {
private Executor executor;
/**
* 设置执行器
*
* @param executor
*/
public void setExecutor(Executor executor) {
this.executor = executor;
}
/**
* 用执行器执行多个任务
*/
public void executeTasks() {
//连续执行10个任务
for ( int i = 0; i < 10; i++) {
executor.execute( new TestTask( "任务" + i));
}
}
public static void main(String[] args) {
TestExecutor testExecutor = new TestExecutor();
testExecutor.setExecutor(Executors.newFixedThreadPool(2));
testExecutor.executeTasks();
}
}
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
/**
* 定时器测试
*
* @author leizhimin,2008-10-9 10:48:32
*/
public class TestExecutor {
private Executor executor;
/**
* 设置执行器
*
* @param executor
*/
public void setExecutor(Executor executor) {
this.executor = executor;
}
/**
* 用执行器执行多个任务
*/
public void executeTasks() {
//连续执行10个任务
for ( int i = 0; i < 10; i++) {
executor.execute( new TestTask( "任务" + i));
}
}
public static void main(String[] args) {
TestExecutor testExecutor = new TestExecutor();
testExecutor.setExecutor(Executors.newFixedThreadPool(2));
testExecutor.executeTasks();
}
}
运行结果:
执行 任务1 ,所在线程ID为:9
执行 任务0 ,所在线程ID为:8
执行 任务2 ,所在线程ID为:9
执行 任务3 ,所在线程ID为:8
执行 任务4 ,所在线程ID为:9
执行 任务5 ,所在线程ID为:8
执行 任务6 ,所在线程ID为:9
执行 任务7 ,所在线程ID为:8
执行 任务8 ,所在线程ID为:9
执行 任务9 ,所在线程ID为:8
执行 任务0 ,所在线程ID为:8
执行 任务2 ,所在线程ID为:9
执行 任务3 ,所在线程ID为:8
执行 任务4 ,所在线程ID为:9
执行 任务5 ,所在线程ID为:8
执行 任务6 ,所在线程ID为:9
执行 任务7 ,所在线程ID为:8
执行 任务8 ,所在线程ID为:9
执行 任务9 ,所在线程ID为:8
执行结果表明:在使用Executor执行多线程任务的时候,线程池的机制节省了系统资源,也加快了执行速度。但是执行完10个任务后,程序的主线程一直也没有退出,目前本人还没深入研究。有兴趣的话,各位博友可以研究研究,并发表您的观点。