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());
        }
}
 
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();
        }
}
 
运行结果:
执行 任务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
 
执行结果表明:在使用Executor执行多线程任务的时候,线程池的机制节省了系统资源,也加快了执行速度。但是执行完10个任务后,程序的主线程一直也没有退出,目前本人还没深入研究。有兴趣的话,各位博友可以研究研究,并发表您的观点。