zoukankan      html  css  js  c++  java
  • 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();
                     }
                }
            }
        }
    }
  • 相关阅读:
    maven scope取值
    HashMap 解析
    MySQL中int(M)和tinyint(M)数值类型中M值的意义
    PyCharm 快捷键
    js 闭包,原型链,作用域链
    阿拉伯数字转中文大写金额JS(JavaScript方法)
    JSch
    Java面试点 -【笔记】
    tomcat Connector配置项 参数优化说明
    QRCanvas 示例使用
  • 原文地址:https://www.cnblogs.com/winkey4986/p/4159435.html
Copyright © 2011-2022 走看看