zoukankan      html  css  js  c++  java
  • 多线程的例子

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

      其中包括一个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个

  • 相关阅读:
    AngularJS之页面跳转Route
    ajax上传图片的本质
    JQuery-基础学习1
    Java跨域问题的处理详解
    红黑树
    查找算法
    八大排序算法
    linux下安装nginx
    libevent 和 libev 提高网络应用性能
    Linux下libevent安装与示例
  • 原文地址:https://www.cnblogs.com/shenliang123/p/2226921.html
Copyright © 2011-2022 走看看