Java多线程实现同步——wait()和notify()实现
2015-08-20 00:57
627 查看
要求:子线程循环5次,接着主线程循环10次,接着又回到子线程。如此循环50次。
实现以上要求的时候,除了直白的面向过程的实现,可以考虑面向对象的写法。
根据高内聚的原装,将子线程和主线程的操作都封装一起。
通过wait()和notify()进行同步。
class Business { private boolean shouldSub = true; public synchronized void sub(int k) { if (shouldSub) { for (int i=0 ; i<5 ; i++) { System.out.println("sub thread inner of " + i + " ,outer " + k); } shouldSub = false; this.notifyAll(); } else { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } public synchronized void main(int k) { if (!shouldSub) { for (int i=0 ; i<10 ; i++) { System.out.println("main thread inner of " + i + " ,outer " + k); } shouldSub = true; this.notifyAll(); } else { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } }
public class TraditionalThreadCommucation { public static void main(String[] args) { final Business business = new Business(); new Thread(new Runnable() { @Override public void run() { for (int k=0; k<50 ;k++){ business.sub(k); } } }).start(); new Thread(new Runnable() { @Override public void run() { for (int k=0; k<50 ;k++){ business.main(k); } } }).start(); } }
根据以上的设计思路,我们来解另一道题:
一个文件中有10000个数,用Java实现一个多线程程序将这个10000个数输出到5个不用文件中(不要求输出到每个文件中的数量相同)。要求启动10个线程,两两一组,分为5组。每组两个线程分别将文件中的奇数和偶数输出到该组对应的一个文件中,需要偶数线程每打印10个偶数以后,就将奇数线程打印10个奇数,如此交替进行。同时需要记录输出进度,每完成1000个数就在控制台中打印当前完成数量,并在所有线程结束后,在控制台打印”Done”.
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.PrintWriter; import java.util.Random; public class MyPrintByThread { public static void main(String[] args) { try { PrintWriter pw = new PrintWriter(new FileWriter(new File("input.txt")),true); Random random = new Random(); for (int i=0 ; i<10000 ; i++) { pw.print(Math.abs(random.nextInt()%100) + " "); } pw.flush(); pw.close(); BufferedReader reader = new BufferedReader(new FileReader("input.txt")); String str = reader.readLine(); reader.close(); String[] strs = str.split(" "); int j=0; for (int i=0 ; i<5 ;i++) { int records[] = new int[2000]; for (int k=0 ; k<2000 ; k++) { records[k] = Integer.parseInt(strs[j]); j++; } PrintWriter writer = new PrintWriter(new FileWriter(new File("output"+i+".txt")),true); final Business business = new Business(writer, records); new Thread(new Runnable() { @Override public void run() { business.printEven(); } }); new Thread(new Runnable() { @Override public void run() { business.printOdd(); } }); } } catch (Exception e) { e.printStackTrace(); } } } class Business { private boolean shouldEven = true; private int[] subRecords; private PrintWriter pw; private int evenPointer = 0; private int oddPointer = 0; public Business(PrintWriter pw,int[] subRecords) { this.pw = pw; this.subRecords = subRecords; } public synchronized void printEven() { if (shouldEven) { if (evenPointer <= subRecords.length) { for (int i=0 ; i<10 ;) { if (subRecords[evenPointer] % 2 == 0) { pw.print(subRecords[evenPointer] + " "); if (evenPointer % 1000 == 0) System.out.println("已经打印:" + evenPointer); i++; } evenPointer++; } } shouldEven = false; this.notify(); } else { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } public synchronized void printOdd() { if (!shouldEven) { if (oddPointer <= subRecords.length) { for (int i=0 ; i<10 ;) { if (subRecords[oddPointer] % 2 != 0) { pw.print(subRecords[oddPointer] + " "); if (evenPointer % 1000 == 0) System.out.println("已经打印:" + oddPointer); i++; } oddPointer++; } } shouldEven = true; this.notify(); } else { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } }
代码未经过测试,热心的朋友可以给我留言,支出修改的地方。
相关文章推荐
- java使用轮询和wait()/notify()实现多线程之间的通信
- Java多线程——使用wait/notify实现生产者/消费者模式
- JAVA多线程使用synchronized与wait,notify实现排它,同步通信
- Java多线程---------同步与死锁:synchronized;等待与唤醒:wait、notify、notifyAll;生命周期
- 多线程 : 使用 wait 和 notify 实现进程间同步通信
- Java多线程实现生产者消费者程序(Wait,Notify实现和Lock,Condition实现)
- Java多线程通信-利用传统的线程通信wait(),notify()方法实现“生产者消费者模式”
- Java 同步监视器中的 wait() 和 notify() 方法的具体实现
- Java 多线程实现生产者消费者问题(wait/notify)
- Java 多线程(Thread) 同步(synchronized) 以及 wait, notify 相关 [实例介绍]
- Java多线程之~~~~使用wait和notify实现生产者消费者模型
- Java多线程--同步与死锁:synchronized;等待与唤醒:wait、notify、notifyAll;生命周期
- java并发包中的Condition和Lock 取代Synchronized、wait、notify/notifyAll实现线程的同步与互斥
- java多线程解说【肆】_锁实现:wait()/notify()
- Java第七课 Java的多线程程序进程和线程的概念,实现多线程的两种方式,线程同步的原理,线程的死锁,运用wait和notify来实现producer - consumer关系,线程终止的两种情况。
- Java多线程wait,notify以及同步锁的运用实例
- Java多线程之~~~~使用wait和notify实现生产者消费者模型
- Java多线程——线程间通信之wait(),notify()方法,生产者与消费者模式实现,管道流
- Java多线程设计wait、notify、notifyall、synchronized的使用机制
- java线程同步原理及wait,notify的用法及与sleep的区别