多线程经典问题:馒头问题 生产和消费问题(线程的通信问题)
2017-08-12 17:12
253 查看
生产者消费者问题,涉及到几个类
* 既然是生产者、消费者,那么生产者类和消费者类就是必须的
*生产什么,消费什么,所有物品类是必须的,这里是馒头类
*既然是线程,那么就不是一对一的,也就是说不是生产一个消费一个,既然这样,多生产的往哪里放,
* 现实中就是筐了,在计算机中也就是数据结构,筐在数据结构中最形象的就是栈了,因此还要一个栈类
package com.mt;
/**
* 馒头类
*
* @author Administrator
*
*/
public class Mt {
// 馒头的编号
int number;
// 馒头的构造方法
public Mt(int number) {
this.number = number;
}
// toString重写方法
@Override
public String toString() {
return "Mt [number=" + number + "]";
}
}
* 既然是生产者、消费者,那么生产者类和消费者类就是必须的
*生产什么,消费什么,所有物品类是必须的,这里是馒头类
*既然是线程,那么就不是一对一的,也就是说不是生产一个消费一个,既然这样,多生产的往哪里放,
* 现实中就是筐了,在计算机中也就是数据结构,筐在数据结构中最形象的就是栈了,因此还要一个栈类
package com.mt;
/**
* 馒头类
*
* @author Administrator
*
*/
public class Mt {
// 馒头的编号
int number;
// 馒头的构造方法
public Mt(int number) {
this.number = number;
}
// toString重写方法
@Override
public String toString() {
return "Mt [number=" + number + "]";
}
}
package com.mt; /** * 馒头筐 存馒头和取馒头都在这里面进行编订方法 * * @author Administrator * */ public class Kuang { // 定义一个馒头 筐可以放多少馒头的变量的定义(筐盖) int index = 0; // 馒头筐可以装多少个 用数组表示 Mt[] mt = new Mt[6]; // 装馒头的方式 public synchronized void zhuang(Mt m) throws Exception { // 如果装满就停止等待 if (mt.length == index) { wait(); } // 然后唤醒其他的 线程 notify(); mt[index] = m; index++; System.out.println("装进馒头" + m); } // 往外面拿馒头 public synchronized Mt na() throws Exception { // 当馒头见底 没馒头了 就停止 等待 然后唤醒其他的线程 if (index == 0) { wait(); } notify(); System.out.println("拿出馒头" + index); index--; return mt[index]; } }
package com.mt; /** * 馒头的生产者 * * @author Administrator * */ public class ShengChan extends Thread { Kuang s; // 因为 线程的资源是唯一的 这里筐就是唯一的 将筐传进来 public ShengChan(Kuang s) { this.s = s; } @Override public void run() { // 生产馒头 for (int i = 1; i <= 20; i++) { Mt m = new Mt(i); System.out.println("生产了馒头" + i); try { // 生产了 装进框里 每生产1个休息10毫秒 s.zhuang(m); Thread.sleep(10); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
package com.mt; /** * 馒头的消费者 * * @author Administrator * */ public class XiaoFei extends Thread { Kuang s; // 将筐传进来 public XiaoFei(Kuang s) { this.s = s; } @Override public void run() { // 线程消费馒头 for (int i = 1; i <= 20; i++) { try { // 每消费一个休息100毫秒 Thread.sleep(100); s.na(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
package com.mt; /** * 测试类 测试是否可行 * * @author Administrator * */ public class Test { public static void main(String[] args) { // new一个框 因为都需要框 Kuang k = new Kuang(); ShengChan s = new ShengChan(k); s.start(); XiaoFei x = new XiaoFei(k); x.start(); } }
相关文章推荐
- 多线程的经典案例(生产消费问题)
- 生产者消费者问题 这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者
- 多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】
- 生产者消费者问题 这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者
- 生产者消费者问题 这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者
- 多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】
- java学习9:生产和消费问题,先生产才能消费,线程间通信与等待
- 多线程之偷了个懒之经典生产消费问题
- Java 多线程间通信 多生产 多消费问题
- 线程间通信--生产消费
- 多线程生产消费问题
- 多线程多生产多消费问题以及解决
- 多线程的深入学习:单生产单消费,单生产多消费,多生产多消费,守护线程,线程优先级,join和yield,线程内部匿名类
- 多线程中多生产多消费问题
- java 多线程(线程间通信-解决安全问题)
- 经典的生产与消费线程同步问题
- 反射、注解和线程、Thread、同步锁问题和基于多线程的Server通信(8.4)
- 多线程中的线程通信以及死锁问题
- Java/Android多线程并发、同步,线程之间通信,主、子线程的一些问题(CountDownLatch、CyclicBarrier和Semaphore)
- 多线程——用创建线程的两种方式分别解决经典窗口卖票问题