建立線程池,池裏有多個線程,每一個線程每次只讀取某個字符串的一個字符,從第一個字符依次開始讀取。所有讀完後從新讀。讀三遍結束這個線程池。數組
// 線程池任務類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();
}