博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java生产者消费者问题(线程同步与线程等待的应用)
阅读量:5759 次
发布时间:2019-06-18

本文共 2472 字,大约阅读时间需要 8 分钟。

hot3.png

生产者

 

/** * 类说明:生产者 *  * @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
buffer = new ArrayList
(); 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();	}}
 

转载于:https://my.oschina.net/java2010/blog/356485

你可能感兴趣的文章
显式锁(第十三章)
查看>>
SCCM的证书配置PKI
查看>>
看linux书籍做的一些重要笔记(2011.07.03更新)
查看>>
CString、Char* ,char [20]、wchar_t、unsigned short转化
查看>>
从案例学RxAndroid开发(上)
查看>>
Redis学习手册(内存优化)
查看>>
浅尝TensorFlow on Kubernetes
查看>>
springboot系列十 Spring-Data-Redis
查看>>
Confluence 6 注册外部小工具
查看>>
excel进行矩阵计算
查看>>
基于Android平台的动态生成控件和动态改变控件位置的方法
查看>>
linux 死机分析
查看>>
BOM
查看>>
iOS: Block的循环引用
查看>>
mysql实战02 | 日志系统:一条SQL更新语句是如何执行的?
查看>>
ECC椭圆曲线详解(有具体实例)
查看>>
Linux常见命令(二)
查看>>
PyCharm切换解释器
查看>>
jmp far ptr s所对应的机器码
查看>>
css详解1
查看>>