Java并发框架Excecutor

Java SE5的java.util.concurrent包中的执行器(Executor)将为你管理Thread对象,从而简化了并发编程。Executor在客户端和执行任务之间提供了一个间接层,Executor代替客户端执行任务。Executor允许你管理异步任务的执行,而无须显式地管理线程的生命周期。Executor在Java SE5/6中时启动任务的优选方法。Executor引入了一些功能类来管理和使用线程Thread,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等

接口Executor只有一个方法execute,接口ExecutorService扩展了Executor并添加了一些生命周期管理的方法,如shutdown(可以防止新任务被提交给这个Executor,当前线程将继续运行在shutdown()被调用之前提交的所有任务)、submit等。一个Executor的生命周期有三种状态,运行 ,关闭 ,终止。

创建线程池
Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。

创建固定数目线程的线程池。
public static ExecutorService newFixedThreadPool(int nThreads)

创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果没有现有线程可用,则创建一个新线程并添加到
池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程
public static ExecutorService newCachedThreadPool()

创建一个单线程化的Executor。以确保任意时刻在任何线程中都只有唯一的任务在运行。其就像是线程数量为1的FixedThreadPool
public static ExecutorService newSingleThreadExecutor()

创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)

Runnable接口和Callable接口
Runnable是执行工作的独立任务,但是它(方法run())不返回任何值。

而在Java SE5引入的Callabel是一种具有类型参数的泛型,他的类型参数表示的是从方法call()(而不是run())中返回的值,并且必须使用ExcecutorService.submit()方法调用它。

import java.util.*;
import java.util.concurrent.*;
class TaskWithResult implements Callable<String>{
    private int id;
    public TaskWithResult(int id) {
    	this.id=id;
    }
	@Override
	public String call() throws Exception {
		// TODO Auto-generated method stub
		return "result of TaskWithResult "+id;
	}
	
}
public class CallableDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        ExecutorService exec=
        		Executors.newCachedThreadPool();
        ArrayList<Future<String>> results=
        		new ArrayList<Future<String>>();
        for(int i=0;i<10;i++) {
        	results.add(exec.submit(new TaskWithResult(i)));
        }
        for(Future<String> fs:results) {
        	try {
        		System.out.println(fs.get());
        	}catch(Exception e) {
        		e.printStackTrace();
        	}
        }
	}

}
/*
result of TaskWithResult 0
result of TaskWithResult 1
result of TaskWithResult 2
result of TaskWithResult 3
result of TaskWithResult 4
result of TaskWithResult 5
result of TaskWithResult 6
result of TaskWithResult 7
result of TaskWithResult 8
result of TaskWithResult 9
*/

submit()方法会产生future对象,它用Callable返回结果的特定类型进行了参数化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章