java线程池的应用浅析

存数据工具类,专门存放主线程读取上来的数据

import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;

/**
 * 保存每次主线程读上来的字符串数组
 * @author winkey
 *
 */
public class BatchDataArrHolder {

    private static final int QUEUE_SIZE = 1000000;

    private static Queue<String[]> DATA_QUEUE = new ArrayBlockingQueue<String[]>(QUEUE_SIZE);

    public static void push(String[] data) {
        DATA_QUEUE.add(data);
    }

    public static String[] take(){
        try {
            return ((ArrayBlockingQueue<String[]>)DATA_QUEUE).take();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static boolean isEmpty(){
        return DATA_QUEUE.isEmpty();
    }
}

主程序类:

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;

/**
 * 多线程 字符流
 * @author winkey
 *
 */
public class MyThread2 extends Thread{
    public static SortArray sortArray = new SortArray(10000) ;

    public void run(){
        //这个方法这么写对吗???
        while(true){
            String[] batchDataArr = BatchDataArrHolder.take();
            if (null == batchDataArr) continue;
            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);            //setBit方法定义在排序类里面,我在setBit方法上加了关键字synchronized,这样对吗??
                    sortArray.setBit(numAsInt, 1);
                }
            }
        }
    } 

    public static void main(String[] args) throws Exception {
        BufferedReader in = new BufferedReader(new FileReader("E:\\b.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 mt1 = new MyThread2();
            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);//主线程将每次读上来的数据保存到 

                if(isEnd==true){
                    break;
                }
            }
             //关闭线程用,这么关闭子线程对吗???
             while(true){
                 if(BatchDataArrHolder.isEmpty()){
                     pool.shutdown();
                     break;
                 }
             }
            //写数据
            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();
                 }
            }
        }
    }
}
时间: 2024-11-02 12:17:14

java线程池的应用浅析的相关文章

Java线程池应用

Executors工具类用于创建Java线程池和定时器. newFixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程.在任意点,在大多数 nThreads 线程会处于处理任务的活动状态.如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待.如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要).在某个线程被显式地关闭之前,池中的线程将一直存在. 创建一个固定大小的线程池来执

java线程池

1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? 1 new Thread(new Runnable() { 2 3 @Override 4 public void run() { 5 // TODO Auto-generated method stub 6 } 7 }).start(); 那你就out太多了,new Thread的弊端如下: a. 每次new Thread新建对象性能差. b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过

Java线程池使用说明

Java线程池使用说明 一 简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用.为我们在开发中处理线程的问题提供了非常大的帮助. 二:线程池 线程池的作用: 线程池作用就是限制系统中执行线程的数量.     根 据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少

Java 线程池的原理与实现

最近在学习线程池.内存控制等关于提高程序运行性能方面的编程技术,在网上看到有一哥们写得不错,故和大家一起分享. [分享]Java 线程池的原理与实现 这几天主要是狂看源程序,在弥补了一些以前知识空白的同时,也学会了不少新的知识(比如 NIO),或者称为新技术吧.线程池就是其中之一,一提到线程,我们会想到以前<操作系统>的生产者与消费者,信号量,同步控制等等.一提到池,我们会想到数据库连接池,但是线程池又如何呢? 建议:在阅读本文前,先理一理同步的知识,特别是syncronized同步关键字的用

Java 线程池学习

Reference: <创建Java线程池>[1],<Java线程:新特征-线程池>[2], <Java线程池学习>[3],<线程池ThreadPoolExecutor使用简介>[4],<Java5中的线程池实例讲解>[5],<ThreadPoolExecutor使用和思考>[6] [1]中博主自己通过ThreadGroup实现一个线程池(挺方便理解的),使用的是jdk1.4版本,Jdk1.5版本以上提供了现成的线程池. [2]中介绍

JAVA线程池的分析和使用

http://www.infoq.com/cn/articles/java-threadPool/ 1. 引言 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行.第三:提高线程的可管理性.线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控.但是要做到合理的利用线程池,必须对其原理了如指掌. 2. 线程池

java线程池分析和应用

比较 在前面的一些文章里,我们已经讨论了手工创建和管理线程.在实际应用中我们有的时候也会经常听到线程池这个概念.在这里,我们可以先针对手工创建管理线程和通过线程池来管理做一个比较.通常,我们如果手工创建线程,需要定义线程执行对象,它实现的接口.然后再创建一个线程对象,将我们定义好的对象执行部分装载到线程中.对于线程的创建.结束和结果的获取都需要我们来考虑.如果我们需要用到很多的线程时,对线程的管理就会变得比较困难.我们手工定义线程的方式在时间和空间效率方面会存在着一些不足.比如说我们定义好的线程

Java线程池:ExecutorService,Executors

简单的Java线程池可以从Executors.newFixedThreadPool( int n)获得.此方法返回一个线程容量为n的线程池.然后ExecutorService的execute执行之. 现给出一个示例. package zhangphil.executorservice; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ZhangPhil

JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue .

从Java5开始,Java提供了自己的线程池.每次只执行指定数量的线程,java.util.concurrent.ThreadPoolExecutor 就是这样的线程池.以下是我的学习过程. 首先是构造函数签名如下: [java] view plain copy print ? public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<