博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程的例子
阅读量:6091 次
发布时间:2019-06-20

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

写出一组模拟生产者/消费者的协作程序

  其中包括一个WoTou.java,代表消息

  一个MsgQueue.java,为一个队列,提供put(Message msg)方法和get()方法

  一个Produer.java,为生产者线程,在其run方法中每隔1秒产生一个Message对像并放入MsgQueue队列

  一个Consumer.java为消费者线程,在其run方法中不断从MsgQueue队列中获取Message对像,并显示在屏幕上

  一个TestMain.java,在其main方法中,启动2个Produer线程和2个消费者线程.

  要求:

  对于MsgQueue.java,队列的长度为10,当消息超过10个时,put()方法需要阻塞:当消息队列为空时,

  get()方法需要阻塞。

  public class ProducerConsumer {

  public static void main(String[] args) {

  SyncStack ss = new SyncStack();

  Producer p1= new Producer(ss,"p1");

  Consumer c1= new Consumer(ss,"c1");

  Producer p2= new Producer(ss,"p2");

  Consumer c2= new Consumer(ss,"c2");

  }

  }

  class WoTou<T> {

  int id;

  WoTou(int id) {

  this.id = id;

  }

  public String toString() {

  return "WoTou : " + id;

  }

  }

  class SyncStack {

  int index = 0;

  WoTou[] arrWT = new WoTou[6];

  public void push(WoTou wt) {

  while(index == arrWT.length) {

  try {

  this.wait();

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  this.notifyAll();

  arrWT[index] = wt;

  index ++;

  }

  public WoTou pop() {

  while(index == 0) {

  try {

  this.wait();

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  this.notifyAll();

  index--;

  return arrWT[index];

  }

  }

  class Producer implements Runnable {

  SyncStack ss = null;

  String a;

  Producer(SyncStack ss,String a) {

  this.ss = ss;

  this.a= a;

  Thread t=new Thread(this,a);

  t.start();

  }

  public void run() {

  for(int i=0; i<10; i++) {

  synchronized(ss){

  WoTou wt = new WoTou(i);

  ss.push(wt);

  System.out.println(a+" 生产了:" + wt);}

  try {

  Thread.sleep((int)(Math.random() * 200));

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  }

  }

  class Consumer implements Runnable {

  SyncStack ss = null;

  String a;

  Thread t;

  Consumer(SyncStack ss,String a) {

  this.ss = ss;

  this.a= a;

  t=new Thread(this,a);

  t.start();

  }

  public void run() {

  for(int i=0; i<10; i++) {

  synchronized(ss){

  WoTou wt = ss.pop();

  System.out.println(a+" 消费了: " + wt);}

  try {

  Thread.sleep((int)(Math.random() * 1000));

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  }

  }

  p1 生产了:WoTou : 0

  p2 生产了:WoTou : 0

  p3 生产了:WoTou : 0

  c1 消费了: WoTou : 0

  c1 消费了: WoTou : 0

  p3 生产了:WoTou : 1

  c1 消费了: WoTou : 1

  c1 消费了: WoTou : 0

  p3 生产了:WoTou : 2

  p1 生产了:WoTou : 1

  c1 消费了: WoTou : 1

  p2 生产了:WoTou : 1

  p2 生产了:WoTou : 2

  c1 消费了: WoTou : 2

  p2 生产了:WoTou : 3

  p3 生产了:WoTou : 3

  c1 消费了: WoTou : 3

  p3 生产了:WoTou : 4

  p2 生产了:WoTou : 4

  c1 消费了: WoTou : 4

  c1 消费了: WoTou : 4

  p1 生产了:WoTou : 2

  c1 消费了: WoTou : 2

  p2 生产了:WoTou : 5

  p3 生产了:WoTou : 5

  p2 生产了:WoTou : 6

  栈里有6个

 

转载地址:http://selwa.baihongyu.com/

你可能感兴趣的文章
java基础---->正则表达式
查看>>
2.2013/06/13_log(n)+1
查看>>
关于加载iframe时进度条不消失的问题
查看>>
poj 3984迷宫问题【广搜】
查看>>
oracle ORA-01840:输入值对于日期格式不够长
查看>>
python基础知识~logger模块
查看>>
SIP入门(二):建立SIPserver
查看>>
Servlet3.0的异步
查看>>
WebService连接postgresql( 失败尝试)
查看>>
从头认识java-13.11 对照数组与泛型容器,观察类型擦除给泛型容器带来什么问题?...
查看>>
Python-MacOSX下SIP引起的pip权限问题解决方案(非取消SIP机制)
查看>>
从MFQ方法到需求分析
查看>>
android.view.WindowManager$BadTokenException: Unable to add window
查看>>
HDU5012:Dice(bfs模板)
查看>>
iphone openssh
查看>>
Linux下MEncoder的编译
查看>>
spark高级排序彻底解秘
查看>>
ylbtech-LanguageSamples-PartialTypes(部分类型)
查看>>
福建省促进大数据发展:变分散式管理为统筹集中式管理
查看>>
开发环境、生产环境、测试环境的基本理解和区别
查看>>