文章标题

来源:互联网 发布:java聊天室项目 编辑:程序博客网 时间:2024/06/04 19:52
package day6;import java.io.BufferedReader;import java.io.File;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.util.Random;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;//题目:文件中有有一千个数 写多线程程序 将10000 个数输出到5 个不同的文件中,启动10个线程 22一组 分为5组 每组俩个线程对分别将文件中的奇数和偶数输出到该组对应一个文件中,需要每打印10个奇数后//就打印10个偶数交替进行。同时需要记录输出进度。每完成1000个数的打印就在控制台打印当前完成量,并在所有线程完成结束后,输出done.public class CrossPrint {    private static final String inputFile = "testInput.txt";    public static int count = 100;    public static int ThreadGroupCount =5;    public static void generateTestFile() throws IOException {        //OutputStreamWriter pw = new OutputStreamWriter(new FileOutputStream(new File(inputFile)), "UTF-8");        PrintWriter pw = new PrintWriter(new FileWriter(new File(inputFile)));        Random random = new Random();        for(int i =0;i<count;i++) {            pw.write(Math.abs(random.nextInt())%count + " ");        }        pw.flush();        pw.close();    }    public static void main(String[] args) {        try {            CrossPrint.generateTestFile();            BufferedReader br = new BufferedReader(new FileReader(inputFile));            String str;            String message ="";            while((str = br.readLine())!=null) {                message+=str;                //System.out.println(message.substring(0, 2999));            }            br.close();            String[] a = message.split(" ");            int countForEachFile = count/ThreadGroupCount;            int index = 0;            for(int i =0;i<ThreadGroupCount;i++) {                int[] record = new int[countForEachFile];                for(int j=0;j<countForEachFile;j++) {                    record[j] = Integer.parseInt(a[index]);                    //System.out.println(record[j]);                    index++;                }                PrintGroup printGroup = new PrintGroup(record, i);                printGroup.startPriint();            }        } catch (IOException e) {            e.printStackTrace();        }    }}class PrintGroup{    private Lock lock = new ReentrantLock();    private Condition oddlockCondition = lock.newCondition();    private Condition evenlockCondition = lock.newCondition();    private int[] records;    //private int recordLength;    private boolean flag =true;    //记录输出奇数所在的下标    private int odd_index = 0;    private int even_index = 0;    //输出流    private PrintWriter printWriter;    public PrintGroup(int[] records,int ids) throws IOException {        this.records = records;         printWriter = new PrintWriter(new FileWriter(new File("file"+ids+".txt")));    }    public void startPriint() {        OddPrintThread oddPrintThread = new OddPrintThread();        oddPrintThread.start();        EvenPrintThread evenPrintThread = new EvenPrintThread();        evenPrintThread.start();    }    private class OddPrintThread extends Thread{        @Override        public void run() {            try {                while(true) {                    lock.lock();                if(flag) {                    flag = false;                    //让等待打印偶数的线程先执行                    oddlockCondition.await();                }                for(int i=0;i<10;) {                    if(odd_index>=records.length) {                        break;                    }                    if(records[odd_index]%2==1) {                        i++;                        System.out.println(records[odd_index]);                        printWriter.write(records[odd_index]+" ");                        printWriter.flush();                    }                     odd_index++;                }                }            } catch (InterruptedException e) {                e.printStackTrace();            }finally {                evenlockCondition.signal();;                lock.unlock();            }        }    }    private class EvenPrintThread extends Thread{        @Override        public void run() {        while(true) {            lock.lock();        try {            for(int i=0;i<10;) {                if(odd_index>=records.length&&even_index>=records.length) {                    printWriter.flush();                    printWriter.close();                    return;                }                if(even_index>=records.length) {                    break;                }                if(records[even_index]%2 == 0) {                    i++;                    System.out.println(records[even_index]);                    printWriter.write(records[even_index]+" ");                    printWriter.flush();                }                even_index++;            }            oddlockCondition.signal();            evenlockCondition.await();            } catch (InterruptedException e) {                e.printStackTrace();            }finally {                lock.unlock();                printWriter.close();            }        }        }    }}

创建condition实例其实就是

原创粉丝点击