文章标题
来源:互联网 发布: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实例其实就是
阅读全文
0 0
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- react-native学习之路4-设置类似于安卓里面的GridView的布局
- python之闭包
- Hibernate搭建开发环境+简单实例(二)
- c++ 合并两个无序的单链表使其仍为无序
- 笔记
- 文章标题
- Python 函数修饰符(装饰器)的学习
- c++二分查找实现(非递归和递归方式)
- pcl点云处理基本步骤
- leetcode题记——Two Sum
- 1057数零壹(进制转换)
- MySQL中join详解
- MySQL 锁机制常用知识点有哪些?
- Flex布局实现圣杯布局和网格布局