建立线程池,池里有多个线程,每一个线程每次只读取某个字符串的一个字符,从第一个字符依次开始读取。所有读完后从新读。读三遍结束这个线程池。数组
// 线程池任务类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();
}