JDK5中增長了Doug Lea的併發庫,這一引進給java線程的管理和使用提供了強大的便利性。 java
java.util.current包中提供了對線程優化、管理的各項操做,使得線程的使用變得的心應手。該包提供了線程的運行,線程池的建立,線程生命週期的控制,線程間的協做等功能。 併發
1、核心API介紹 優化
1、 this
Executor接口 spa
public void 線程
execute(Runnable runnable); code
該接口聲明瞭execute方法,將Runnable對象傳入,啓動該方法至關於啓動了該線程 對象
2、ExecutorService接口 接口
該接口是Executor的子接口,提供了submit方法,該方法返回Future對象,Future可用於控制線程的執行 生命週期
與取消
3、ScheduledExecutorService接口
該接口是ExecutorService的子接口,提供了線程啓動時機的控制
4、Callable接口
提供了以下方法
public Object call() throws Exception;
該接口相似Runnable接口,只是有返回值和拋出的異常,該方法返回的值就是ExecutorService接口調用
submit(Callable
call)方法的Future調用get方法返回的值。
5、Future接口
Future接口用於控制線程的執行。調用cancell(boolean
bool)方法將會取消正在運行的進程。
另外ExecutorService的shutDown()方法將啓動一次順序關閉,執行之前提交的任務,但不接受新任務。如 果已經關閉,則調用沒有其餘做用;shutDownNow()方法試圖中止全部正在執行的活動任務,暫停處理正在等待的任務,並返回等待執行的任務列表。
6、Executors
這是一個線程池的工廠類,該類提供了許多生成Executor,ExecutorService,ScheduleExecutorService的工廠方法。
其實,Executor就至關於一個線程池,提供對線程的管理功能,包括啓動線程,取消線程執行,加入線 程,移除線程,以及協調線程之間的工做等功能,這些隨着Executor級別(即子接口,實現類)越高而功 能越強。
2、應用簡介
1、啓動一個線程
Executor executor=Executors.newFixedThreadPool(3);
executor.execute(new Ruannble(){
public void run(){
//your code
}
});
也能夠啓動Callable形式的線程
ExecutorService executor=Executors.newFixedThreadPool(3);
executor.submit(new Callable(){
public Object call()throws Exception{
Object o=null;
// your code;
return o;
}
});
注意,以上的方法每執行一次就運行一次Runnable或Callable對象的run(),call()方法,若是生成的Executor對象指定了數目,例如上面中是3,則當調用execute方法或submit方法時到達3次以上時,實際上同時運行的線程最多隻有3個,是按照順序的(即多出來的,後放進去的線程沒有運行),只有當Executor池中正在運行的線程少於3個(即某些線程處於idle空虛狀態,不在運行了),其後多出來的線程纔會開始運行(按調用執行的順序),但任什麼時候候最多隻能有3個線程運行。
同一個線程能夠被執行屢次,多長調用執行方法就好了。
2、取消線程的執行
當想終止線程的執行時,能夠調用Future的cancell方法,但也不必定可以終止;另外若是是ExecutorSrvice,也能夠調用shutDownNow或者shutDown方法。shutDown方法將等待當前的線程執行完畢後終止全部的線程,而shutDownNow試圖中止全部正在執行的活動任務,暫停處理正在等待的任務,並返回等待執行的任務列表。
3、順序執行線程
ExecutorService executor=Executors.newFixedThreadPool(3);
Future future=executor.submit(r1);//r1是Runnable或Callable實例
future.get();
executor.submit(r2);/r2是Runnable或Callable實例
以上代碼將會使r1執行完後再執行r2,由於Future的get方法具備阻塞調用者線程的功能,執行get方法時,將會等待Future對應的線程執行完畢後纔會返回結果,其會阻塞調用者線程。
4、從線程池中添加與移除線程
要移除線程,則須要ExecutorService接口的實現類ThreadPoolExecutor或其子類的方法。
在線程池中添加線程
調用execute或submit方法均可以將線程加入線程池,對同一個線程重複調用也能夠,也至關於調用2個不一樣線程,只不過執行相同的代碼。
在線程池中刪除線程
public boolean remove(Runnable task)
從執行程序的內部隊列中移除此任務(若是存在),從而若是還沒有開始,則其再也不運行,若是已經刪除則返回true
public void purge()
嘗試從工做隊列移除全部已取消的 Future 任務。
5、線程的協做
利用CyclicBarrier能夠協調線程的之間的運行,它容許一組線程互相等待,直到到達某個公共屏障點。
例若有一項工做須要有2我的完成,而這項工做有2個步驟,只有在執行第一個步驟只後,才能夠執行第二個步驟,每個步驟都須要2我的參與。這時可使用CyclicBarrier了。2我的表明2個線程,以下。
class Worker implements Runnable{
private Work work;
private int speed;
public Work(Work work,int speed){
this.work=work;
this.speed=speed;
}
public void run(){
work.worked(speed);
}
}
class Work {
private CyclicBarrier barrier;
public Work(CyclicBarrier barrier){
this.barrier=barrier;
}
public void worked(int speed){
firstWork(speed);
secondWork();
}
private void firstWork(int speed){
barrier.await();
try{
Thread.sleep(speed);
}catch(Exception e){
}
}
private void secondWork(){
barrier.await();
}
}
public static void main(String args[]){
CyclicBarrier barrier=new CyclicBarrier(2);
Work work=new Work(barrier);
Worker worker1=new Worker(work);
Worker worker2=new Worker(work);
Executor executor=Executors.newFixedPoolThread(2);
executor.execute(worker1);
executor.execute(worker2);
}
6、線程池的線程回收
CompletionService是一個管理執行完畢的線程的類,以Executor爲參數構造實例。submit方法用於提交任務,彷佛是委派給Executor執行,而take()方法則是獲取並移除表示下一個已完成任務的 Future,若是目前不存在這樣的任務,則等待。,pool也相似只不過當時沒有時返回null並不等待。