java 線程池以及Future的應用

建立線程池,池裏有多個線程,每一個線程每次只讀取某個字符串的一個字符,從第一個字符依次開始讀取。所有讀完後從新讀。讀三遍結束這個線程池。數組

 

// 線程池任務類app

public class MyTask3 {函數

    // 線程池引用this

    private ExecutorService es = null; spa

    // 構造函數-建立帶必定數量線程的線程池線程

    public MyTask3(int num){接口

       this.es = Executors.newFixedThreadPool(num);字符串

    }get

    // 具體任務同步

    private ReadBuddha2 rc = new ReadBuddha2();

    // 自定義方法-供外部調用

    public Object read () throws Exception{

       // 線程池(安排線程)執行任務 - 獲取返回值後返回給調用者

       return es.submit(rc);

    }

    // 關閉線程池---線程池不關閉程序不會自行結束

    public void shutdown(){

       if(es != null){

           System.out.println("關閉線程池");

           es.shutdown();

       }

    }

}

 

 

// 自定義任務 - 實現Callable接口-使調用的調用後能夠使用返回值

class ReadBuddha2 implements Callable{

    // 下標- 0 開始

    private static int index = 0;

    // 字符數組

    private static char [] Buddha = new StringBuffer("法華經-提婆達多品:")

                                    .append("天龍八部~人與非人~")

                                    .append("皆遙見彼龍女成佛")

                                    .toString()

                                    .toCharArray();

    // 讀取次數

    private static int readCount = 0;

    // 具體任務--方法同步-保證線程池中的線程在某一時刻只會有一個來訪問這個方法

    public synchronized Object call() {      

       // 讀取字符後--下標 +1

       char c = Buddha[index++];      

       // 打印是哪一個線程讀到了哪一個字符

       System.out.println(Thread.currentThread().getName() + " read cahr = " + c);

       // 下標等於字符數組長度時爲讀完一次--下標再設爲從 0 開始---讀取次數 +1

       if(index == Buddha.length){

           index = 0;

           readCount++;

           // 若是讀取了 3 --就返回 "1"

           if( readCount == 3 ){

              return "1";

           }

       }

       // 默認都返回 "0"

       return "0";

    }

}

 

 

調用

 

// 建立線程池任務類

MyTask3 t = new MyTask3(5);

boolean b = false;

// 調用屢次任務

for(int i = 0; i < 84; i++){

    // 獲取任務調用後的返回值

    Object o = t.read();

    // 若是返回值爲 "1" 則再也不循環-改變標誌

    if(o.toString().equals("1")){

       b = true;

       break;

    }

}

// 關閉線程池

if(b){

    t.shutdown();

}

相關文章
相關標籤/搜索