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();
                 }
            }
        }
    }
}
原文地址:https://www.cnblogs.com/winkey4986/p/4159435.html