多线程——生产者与消费者
2017-02-13 14:11
211 查看
package com.Test; public class ProduceConsume { public static void main(String[] args) { SyncStack ss = new SyncStack();// 建造一个装馒头的框 Producer p = new Producer(ss);// 新建一个生产者,使之持有框 Consume c = new Consume(ss);// 新建一个消费者,使之持有同一个框 Thread tp = new Thread(p);// 新建一个生产者线程 Thread tc = new Thread(c);// 新建一个消费者线程 tp.start();// 启动生产者线程 tc.start();// 启动消费者线程 } } // 馒头类 class SteamBread { int id;// 馒头编号 SteamBread(int id) { this.id = id; } public String toString() { return "steamBread:" + id; } } // 装馒头的框,栈结构 class SyncStack { int index = 0; SteamBread[] stb = new SteamBread[6];// 构造馒头数组,相当于馒头筐,容量是6 // 放入框中,相当于入栈 public synchronized void push(SteamBread sb) { while (index == stb.length) {// 筐满了,即栈满, try { this.wait();// 让当前线程等待 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } this.notify();// 唤醒在此对象监视器上等待的单个线程,即消费者线程 stb[index] = sb; this.index++; } // 从框中拿出,相当于出栈 public synchronized SteamBread pop() { while (index == 0) {// 筐空了,即栈空 try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } this.notify(); this.index--;// push第n个之后,this.index++,使栈顶为n+1,故return之前要减一 return stb[index]; } } // 生产者类,实现了Runnable接口,以便于构造生产者线程 class Producer implements Runnable { SyncStack ss = null; Producer(SyncStack ss) { this.ss = ss; } @Override public void run() { // 开始生产馒头 for (int i = 0; i < 20; i++) { SteamBread stb = new SteamBread(i); ss.push(stb); System.out.println("生产了" + stb); try { Thread.sleep(10);// 每生产一个馒头,睡觉10毫秒 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } // 消费者类,实现了Runnable接口,以便于构造消费者线程 class Consume implements Runnable { SyncStack ss = null; public Consume(SyncStack ss) { super(); this.ss = ss; } @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 20; i++) {// 开始消费馒头 SteamBread stb = ss.pop(); System.out.println("消费了" + stb); try { Thread.sleep(100);// 每消费一个馒头,睡觉100毫秒。即生产多个,消费一个 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
相关文章推荐
- 多线程之生产者消费者模型
- 生产者--消费者模式,理解多线程并发
- Java多线程之生产者与消费者实现(1p1c)
- Java:多线程之生产者与消费者
- Java 多线程 生产者消费者问题
- Linux下多线程模拟生产者/消费者问题
- 秒杀多线程第十篇 生产者消费者问题
- 多线程程序一段问题代码分析(生产者消费者)
- 秒杀多线程第十篇 生产者消费者问题
- 多线程设计模式Future、Master-Worker和生产者-消费者模型
- 黑马程序员_java多线程中的生产者与消费者
- java多线程生产者消费者
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- Java面试 多线程 生产者消费者
- IOS多线程使用GCD与信号量实现生产者与消费者模式
- JAVA多线程之——经典面试消费者与生产者
- 多线程的那点儿事(之生产者-消费者)
- 基于Java多线程机制的生产者-消费者模型模拟
- 多线程--C#利用多线程实现消费者和生产者模式