java线程池的应用浅析

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.util.Map;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.TimeUnit;



/**

 * 多线程 字符流

 * @author winkey

 *

 */

public class MyThread3 extends Thread{

    public static SortArray sortArray = new SortArray(10000) ;

    

    public String[] dataArr;

    

    public MyThread3(String[] dataArr){

        this.dataArr = dataArr;

    }



    public void run(){  

        //这个地方也有问题,怎么处理临界资源·~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        //其实我只是想多个线程处理batchDataArr数组

        /*for(int i=0;i<batchDataArr.length;i++){

            if(this.index<batchDataArr.length){

                String str = batchDataArr[index++];

                Integer numAsInt = Integer.valueOf(str);

                System.out.println(Thread.currentThread().getName()+"__"+numAsInt);

                sortArray.setBit(numAsInt, 1);

        } */

        //while(true){

            //String[] batchDataArr = BatchDataArrHolder.take();

            //if (null == batchDataArr) continue;

            String[] batchDataArr = this.dataArr;

            if (null != batchDataArr){

                for(int i=0;i<batchDataArr.length;i++){

                    String str = batchDataArr[i];

                    Integer numAsInt = Integer.valueOf(str);

                    System.out.println(Thread.currentThread().getName()+"__"+numAsInt);

                    sortArray.setBit(numAsInt, 1);

                }

            }

        //}

    } 

    

    public static void main(String[] args) throws Exception {    

        BufferedReader in = new BufferedReader(new FileReader("E:\\bbbbbbb.txt"));

        BufferedWriter out = new BufferedWriter(new FileWriter("E:\\cc.txt"));

        BatchDataArrHolder holder = new BatchDataArrHolder();

        int readLength = 0;

        char[] chars = new char[5];

        String tail=null;

        String batchData;

        

        try{

            //创建一个可重用固定线程数的线程池

            ExecutorService pool = Executors.newFixedThreadPool(2);//两个子线程

            

            /*MyThread2 mt2 = new MyThread2();

            pool.execute(mt1);

            pool.execute(mt2);*/

             while(true){

                readLength = in.read(chars, 0, chars.length);

                //没有读上来数据说明上一次读取数据已读完,不再处理

                if(readLength == 0)

                    break;

                boolean isEnd = false;

                //读上来的数据少于数组长度,说明这一次已读完,处理完这次后不再继续读取

                if(readLength < chars.length){

                    //System.out.println(String.valueOf(chars).substring(0, readLength));

                    batchData = String.valueOf(chars).substring(0, readLength);

                    isEnd = true;

                }else{

                    //System.out.println(String.valueOf(chars));

                    batchData = String.valueOf(chars);

                }

                //接上前一次的剩余数据

                if(tail != null){

                    batchData = ""+tail+batchData;

                }

                //截取本次的剩余数据,留到下次用

                tail = batchData.substring(batchData.lastIndexOf(",")+1,batchData.length());

                if(tail.length()==0){

                    tail = null;

                }

                batchData = batchData.substring(0,batchData.lastIndexOf(","));

                String[] batchDataArr = new String[batchData.split(",").length];//多线程处理这个东西!!!

                batchDataArr = batchData.split(",");

                //holder.push(batchDataArr);//主线程将每次读上来的数据保存到 

                MyThread3 mt1 = new MyThread3(batchDataArr);

                

                pool.execute(mt1);

                if(isEnd==true){

                    break;

                }

            }

             //关闭线程用

             pool.shutdown();//只是不能再提交新任务,等待执行的任务不受影响  

              

                try {  

                    boolean loop = true;  

                    do {    //等待所有任务完成  

                        loop = !pool.awaitTermination(2, TimeUnit.SECONDS);  //阻塞,直到线程池里所有任务结束

                    } while(loop);  

                } catch (InterruptedException e) {  

                    e.printStackTrace();  

                } 

             /*while(true){

                 if(BatchDataArrHolder.isEmpty()){

                     pool.shutdown(); 

                     break;

                 }

             }*/

            //写数据

            //Thread.currentThread().sleep(2000);

            Integer sortUnit = sortArray.getMaxNum();

            System.out.println("最大数为:     "+sortUnit);

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

                if(sortArray.getBit(i)==1){

                    StringBuffer buf = new StringBuffer(""+i+"");

                    buf.append(",");

                    Integer num = sortArray.repeatingData.get(i);

                    if(num!=null && num>=2){

                        for(int j=2;j<=num;j++){

                            buf.append(""+i+"").append(",");

                        }

                    }

                    out.write(buf.toString());

                }                

            }

            out.flush();

        }finally{

            if(in!=null){

                 try{

                     in.close();

                 }catch(IOException e){

                     e.printStackTrace();

                 }

            }

             if(out!=null){

                 try{

                     out.close();

                 }catch(IOException e){

                     e.printStackTrace();

                 }

            }

        }

    }

}

 

你可能感兴趣的:(java线程池)