Java实现线程间通信 Java通过wait()和notifyAll()方法实现线程间通信
FrankYou 人气:0想了解Java通过wait()和notifyAll()方法实现线程间通信的相关内容吗,FrankYou在本文为您仔细讲解Java实现线程间通信的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Java,wait,notifyAll,线程通信,下面大家一起来学习吧。
Java代码(使用了2个内部类):
package Threads; import java.util.LinkedList; /** * Created by Frank */ public class ProdCons { protected LinkedList<Object> list = new LinkedList<>(); protected int max; protected boolean done = false; public static void main(String[] args) throws InterruptedException { ProdCons prodCons = new ProdCons(100, 3, 4); Thread.sleep(5 * 1000); synchronized (prodCons.list) { prodCons.done = true; try { prodCons.notifyAll(); } catch (Exception ex) { } } } private ProdCons(int maxThreads, int nP, int nC) { this.max = maxThreads; for (int i = 0; i < nP; i++) { new Producer().start(); } for (int i = 0; i < nC; i++) { new Consumer().start(); } } class Producer extends Thread { public void run() { while (true) { Object justProduced = null; try { justProduced = getObj(); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (list) { while (list.size() == max) { try { list.wait(); } catch (InterruptedException e) { System.out.println("Producer INTERRUPTED"); } } list.addFirst(justProduced); list.notifyAll(); System.out.println("Produced 1;List size now " + list.size()); if (done) { break; } } } } } class Consumer extends Thread { public void run() { while (true) { Object object = null; synchronized (list) { if (list.size() == 0) { try { list.wait(); } catch (InterruptedException e) { System.out.println("Consumer INTERRUPTED"); } } if (list.size() > 0) { object = list.removeLast(); } list.notifyAll(); System.out.println("List size now " + list.size()); if (done) { break; } } if (null != object) { System.out.println("Consuming object " + object); } } } } private Object getObj() throws InterruptedException { Thread.sleep(1000); return new Object(); } }
加载全部内容