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();

}

相关文章
相关标签/搜索