java線程管理利器:java.util.current的用法舉例

 

JDK5中增長了Doug Lea的併發庫,這一引進給java線程的管理和使用提供了強大的便利性。 java

java.util.current包中提供了對線程優化、管理的各項操做,使得線程的使用變得的心應手。該包提供了線程的運行,線程池的建立,線程生命週期的控制,線程間的協做等功能。 併發

1、核心API介紹 優化

1 this

Executor接口 spa

public void 線程

execute(Runnable runnable); code

該接口聲明瞭execute方法,將Runnable對象傳入,啓動該方法至關於啓動了該線程 對象

2ExecutorService接口 接口

該接口是Executor的子接口,提供了submit方法,該方法返回Future對象,Future可用於控制線程的執行 生命週期

與取消

3ScheduledExecutorService接口

 該接口是ExecutorService的子接口,提供了線程啓動時機的控制

 4Callable接口

 提供了以下方法

 public Object call() throws Exception;

 該接口相似Runnable接口,只是有返回值和拋出的異常,該方法返回的值就是ExecutorService接口調用 

submit(Callable

call)方法的Future調用get方法返回的值。

5Future接口

Future接口用於控制線程的執行。調用cancell(boolean

bool)方法將會取消正在運行的進程。

另外ExecutorServiceshutDown()方法將啓動一次順序關閉,執行之前提交的任務,但不接受新任務。如  果已經關閉,則調用沒有其餘做用;shutDownNow()方法試圖中止全部正在執行的活動任務,暫停處理正在等待的任務,並返回等待執行的任務列表。

6Executors

這是一個線程池的工廠類,該類提供了許多生成ExecutorExecutorServiceScheduleExecutorService的工廠方法。

 其實,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;

    }

});

注意,以上的方法每執行一次就運行一次RunnableCallable對象的run(),call()方法,若是生成的Executor對象指定了數目,例如上面中是3,則當調用execute方法或submit方法時到達3次以上時,實際上同時運行的線程最多隻有3個,是按照順序的(即多出來的,後放進去的線程沒有運行),只有當Executor池中正在運行的線程少於3個(即某些線程處於idle空虛狀態,不在運行了),其後多出來的線程纔會開始運行(按調用執行的順序),但任什麼時候候最多隻能有3個線程運行。

同一個線程能夠被執行屢次,多長調用執行方法就好了。

2、取消線程的執行

當想終止線程的執行時,能夠調用Futurecancell方法,但也不必定可以終止;另外若是是ExecutorSrvice,也能夠調用shutDownNow或者shutDown方法。shutDown方法將等待當前的線程執行完畢後終止全部的線程,而shutDownNow試圖中止全部正在執行的活動任務,暫停處理正在等待的任務,並返回等待執行的任務列表。

3、順序執行線程

ExecutorService executor=Executors.newFixedThreadPool(3);

Future future=executor.submit(r1);//r1RunnableCallable實例

future.get();

executor.submit(r2);/r2RunnableCallable實例

以上代碼將會使r1執行完後再執行r2,由於Futureget方法具備阻塞調用者線程的功能,執行get方法時,將會等待Future對應的線程執行完畢後纔會返回結果,其會阻塞調用者線程。

4、從線程池中添加與移除線程

要移除線程,則須要ExecutorService接口的實現類ThreadPoolExecutor或其子類的方法。

在線程池中添加線程

調用executesubmit方法均可以將線程加入線程池,對同一個線程重複調用也能夠,也至關於調用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並不等待。

相關文章
相關標籤/搜索