读书人

Executor引见

发布时间: 2012-12-22 12:05:06 作者: rapoo

Executor介绍
介绍Java的ThreadPoolExecutor

Java1.5提供了java.util.concurrent.*;以方便多线程编程。

interface Executor是一个接口。你可以理解成你的一个“奴隶管理器”。你把可以异步执行的作业,封装成一个个的Runnable对象。只要你把这些Runnable对象仍给Executor,它就会用合适的方法帮你执行这些作业,你不用关心这个Executor究竟是用几个线程执行你的这些作业的。

举一个例子。请看下面的程序。一行一行读,包括注释。

package tpe; //包的名字不重要。import java.util.concurrent.*; // 这里有你想要的所有好东西。/** * 还记得我说过,作业就是Runnable吧。我们来定义这样一个简单的作业: */class DivideNumbersJob implements Runnable {int a,b;/** * 作业定义如下:输入两个整数a和b。 * @param a 被除数 * @param b 除数 */public DivideNumbersJob(int a, int b) {this.a = a;this.b = b;}/** * 作业要做的工作当然在run()方法中。 * 我们的具体任务呢…… */@Overridepublic void run() {// 就是计算a除以b的商,int c = a/b;// 还有a除以b的余数,int d = a%b;// 并打印到屏幕上。System.out.format("%d / %d === %d mod %d\n", a, b, c, d);}}/** * 下面是我们的主类。 */public class TPEDemo {public static void main(String[] args) throws Exception {// 我们先创建一个Executor。这是一个ThreadPoolExecutor,会利用线程池来并行地// 完成你交给它的作业。构造函数不是很有趣,可以忽略。ThreadPoolExecutor e = new ThreadPoolExecutor(5, 5, 0,TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());// 然后,只要创造作业,丢给它就可以了。e.execute(new DivideNumbersJob(6, 2));// 虽然我们顺序加入,但按什么顺序执行,就看Executor的实现了。e.execute(new DivideNumbersJob(12, 5));e.execute(new DivideNumbersJob(100, 3));// 最后,告诉它,没有更多的作业了。如果你都执行完了,可以把自己关掉。// 如果不这样,这个线程池永远是活跃的。e.shutdown();}}


看看程序执行的结果:
引用
12 / 5 === 2 mod 2
100 / 3 === 33 mod 1
6 / 2 === 3 mod 0


看的出来,结果出现的顺序并不是我们丢给它的顺序。

读书人网 >编程

热点推荐