`
cloverprince
  • 浏览: 129810 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Executor介绍

    博客分类:
  • Java
阅读更多
介绍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()方法中。
	 * 我们的具体任务呢……
	 */
	@Override
	public 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


看的出来,结果出现的顺序并不是我们丢给它的顺序。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics