java生产者消费者问题(线程同步与线程等待的应用)

生产者

1/** 2 * 类说明:生产者 3 * 4 * @author 作者: user 5 * @version 创建时间:2011-4-5 下午01:48:11 6 */ 7public class Producer implements Runnable { 8 private SyncStack ss; 9 private int num; 10 private static int counter = 1; 11 public Producer(SyncStack ss) { 12 this.ss = ss; 13 num = counter++; 14 } 15 @Override 16 public void run() { 17 char c; 18 for (int i = 0; i < 10; i++) { 19 c = (char) (Math.random() * 26 + 'A'); 20 ss.push(c);//向堆栈中添加数据 21 System.out.println("生产者 " + num + ": " + c); 22 try { 23 Thread.sleep((int) (Math.random() * 300)); 24 } catch (InterruptedException e) { 25 e.printStackTrace(); 26 } 27 } 28 } 29}

消费者

1/** 2 * 类说明:消费者 3 * 4 * @author 作者: user 5 * @version 创建时间:2011-4-5 下午01:56:18 6 */ 7public class Consumer implements Runnable { 8 private SyncStack ss;//堆栈对象 9 private int num; 10 private static int counter = 1; 11 public Consumer(SyncStack ss) { 12 this.ss = ss; 13 num = counter++; 14 } 15 @Override 16 public void run() { 17 char c; 18 for (int i = 0; i < 10; i++) { 19 c = ss.pop();//从堆栈中取数据 20 System.out.println("消费者 " + num + ": " + c); 21 try { 22 Thread.sleep((int) (Math.random() * 200)); 23 } catch (InterruptedException e) { 24 e.printStackTrace(); 25 } 26 } 27 } 28}

堆栈类

1import java.util.ArrayList; 2import java.util.List; 3/** 4 * 类说明:堆栈类 5 * 6 * @author 作者: user 7 * @version 创建时间:2011-4-5 下午01:17:48 8 */ 9public class SyncStack { 10 private List<Character> buffer = new ArrayList<Character>(); 11 public SyncStack() { 12 } 13 // 堆栈取数据 14 public synchronized char pop() { 15 char c; 16 if (buffer.size() == 0) { 17 try { 18 System.out.println(Thread.currentThread().getName() 19 + " 正在等待 ……………………"); 20 this.wait();// 如果堆栈中没有数据 则线程等待 21 } catch (Exception e) { 22 e.printStackTrace(); 23 } 24 } 25 c = ((Character) buffer.get(buffer.size() - 1)).charValue(); 26 buffer.remove(buffer.size() - 1); 27 return c; 28 } 29 // 向堆栈中添加数据 30 public synchronized void push(char c) { 31 this.notify();// 唤醒在此对象监视器上等待的单个线程 32 Character ch = new Character(c); 33 buffer.add(ch); 34 } 35}

主方法

1/** 2 * 类说明: 3 * 4 * @author 作者: user 5 * @version 创建时间:2011-4-5 下午01:59:54 6 */ 7public class Main { 8 /** 9 * @param args 10 */ 11 public static void main(String[] args) { 12 SyncStack ss = new SyncStack(); 13 //生产者p 14 Producer p = new Producer(ss); 15 Thread t1 = new Thread(p); 16 t1.start(); 17 //生产者p2 18 Producer p2 = new Producer(ss); 19 Thread t3 = new Thread(p2); 20 t3.start(); 21 //消费者1 22 Consumer c = new Consumer(ss); 23 Thread t2 = new Thread(c); 24 t2.setName("消费者1 "); 25 t2.start(); 26 //消费者1 27 Consumer c2 = new Consumer(ss); 28 Thread t4 = new Thread(c2); 29 t4.setName("消费者2 "); 30 t4.start(); 31 } 32}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前

一 java线程的等待/通知模型

java中线程之间的通信问题,有这么一个模型:一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另一个线程。前者是生产者,后者就是消费者,也可以叫做生产者消费者问题生产者生产了产品,如何通知消费者?下面就介绍下java线程中的等待通知机制。其它语言类似,自行研究。代码附上下面是以买小