java生产者消费者问题(线程同步与线程等待的应用)
2014-12-15 00:00
489 查看
生产者
消费者
堆栈类
主方法
/** * 类说明:生产者 * * @author 作者: user * @version 创建时间:2011-4-5 下午01:48:11 */ public class Producer implements Runnable { private SyncStack ss; private int num; private static int counter = 1; public Producer(SyncStack ss) { this.ss = ss; num = counter++; } @Override public void run() { char c; for (int i = 0; i < 10; i++) { c = (char) (Math.random() * 26 + 'A'); ss.push(c);//向堆栈中添加数据 System.out.println("生产者 " + num + ": " + c); try { Thread.sleep((int) (Math.random() * 300)); } catch (InterruptedException e) { e.printStackTrace(); } } } }
消费者
/** * 类说明:消费者 * * @author 作者: user * @version 创建时间:2011-4-5 下午01:56:18 */ public class Consumer implements Runnable { private SyncStack ss;//堆栈对象 private int num; private static int counter = 1; public Consumer(SyncStack ss) { this.ss = ss; num = counter++; } @Override public void run() { char c; for (int i = 0; i < 10; i++) { c = ss.pop();//从堆栈中取数据 System.out.println("消费者 " + num + ": " + c); try { Thread.sleep((int) (Math.random() * 200)); } catch (InterruptedException e) { e.printStackTrace(); } } } }
堆栈类
import java.util.ArrayList; import java.util.List; /** * 类说明:堆栈类 * * @author 作者: user * @version 创建时间:2011-4-5 下午01:17:48 */ public class SyncStack { private List<Character> buffer = new ArrayList<Character>(); public SyncStack() { } // 堆栈取数据 public synchronized char pop() { char c; if (buffer.size() == 0) { try { System.out.println(Thread.currentThread().getName() + " 正在等待 ……………………"); this.wait();// 如果堆栈中没有数据 则线程等待 } catch (Exception e) { e.printStackTrace(); } } c = ((Character) buffer.get(buffer.size() - 1)).charValue(); buffer.remove(buffer.size() - 1); return c; } // 向堆栈中添加数据 public synchronized void push(char c) { this.notify();// 唤醒在此对象监视器上等待的单个线程 Character ch = new Character(c); buffer.add(ch); } }
主方法
/** * 类说明: * * @author 作者: user * @version 创建时间:2011-4-5 下午01:59:54 */ public class Main { /** * @param args */ public static void main(String[] args) { SyncStack ss = new SyncStack(); //生产者p Producer p = new Producer(ss); Thread t1 = new Thread(p); t1.start(); //生产者p2 Producer p2 = new Producer(ss); Thread t3 = new Thread(p2); t3.start(); //消费者1 Consumer c = new Consumer(ss); Thread t2 = new Thread(c); t2.setName("消费者1 "); t2.start(); //消费者1 Consumer c2 = new Consumer(ss); Thread t4 = new Thread(c2); t4.setName("消费者2 "); t4.start(); } }
相关文章推荐
- java生产者消费者问题(线程同步与线程等待的应用)
- java生产者消费者问题(线程同步与线程等待的应用)
- java生产者消费者问题(线程同步与线程等待的应用)
- 【线程同步】java实现生产者消费者问题与线程中的wait与notify总结
- Java线程与并发编程实践----等待通知(生产者消费者问题)线程
- Java基础_线程_多线程_生产者消费者问题
- Java经典线程同步问题------生产者与消费者
- Java- 简单了解线程 生产者与消费者问题(三)
- java基础12:线程间通信---生产者消费者问题
- Java线程(三):线程协作-生产者/消费者问题
- 线程通信,生产者消费者问题(Java)
- 从java多线程实现“生产者-消费者”模型来谈谈操作系统中线程状态的转换及线程同步的总结
- java基础---->线程 生产者消费者问题
- Java 线程实现生产者和消费者问题
- java线程:三种方式实现生产者消费者问题_1
- java实现的生产者和消费者问题-涉及线程同步与通信
- Java 线程的基本概念(模仿生产者与消费者的问题)
- 线程通信,生产者消费者问题(Java)
- java线程之生产者消费者问题
- day12线程间的通信,等待唤醒机制,生产者消费者问题。新锁lock(): 守护线程,interrupt()停止线程用,join()yield()