>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 29526 个阅读者 刷新本主题
 * 贴子主题:  关于线程通信代码错误(例程13-25 SyncTest) 回复文章 点赞(0)  收藏  
作者:liuyuan888    发表时间:2018-04-23 09:54:46     消息  查看  搜索  好友  邮件  复制  引用

您的run方法编译能通过吗

这是您改动过的push 方法
public synchronized void push(String goods) {
  this.notifyAll();
  while(point==buffer.length-1){
  System.out.println(Thread.currentThread().getName()+"--->"+":wait()");
  try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
  }
    point++;
    Thread.yield();
    buffer=goods;
  
  }
}
这是没有改动的run方法
public void run() {
    String goods;
    for (int i = 0; i < 200; i++) {
      synchronized(theStack){
        goods="goods"+(theStack.getPoint()+1);
        if(theStack.push(goods))
           System.out.println(getName()+ ": push " + goods +" to "+theStack.getName());
      }
      yield();
    }
  }


程序猿的技术大观园:www.javathinker.net
  Java面向对象编程-->Lambda表达式
  JavaWeb开发-->JSP技术详解(Ⅱ)
  JSP与Hibernate开发-->持久化层的映射类型
  Java网络编程-->基于MVC和RMI的分布式应用
  精通Spring-->Vue简介
  Vue3开发-->Vue Router路由管理器
  [分享]遊藝場開分員會很難嗎?原來工作項目是這些!
  整理收集的一些常用java工具类
  十分钟带你搞懂 Java AQS 核心设计与实现!
  被迫重构代码,这次我干掉了 if-else
  面试官刁难:Java字符串可以引用传递吗?
  Java方法的嵌套与递归调用
  Java中的受查异常与非受查异常区别
  NoClassDefFoundError和ClassNotFoundException的区别
  Eclipse使用指南:快速修复功能
  Java入门实用代码:线程状态监测
  Java入门实用代码:获取当前线程名称
  Java 入门实用代码:从 List列表中 截取子列表
  Java入门实用代码:修改链表LinkedList
  Java入门实用代码:获取链表(LinkedList)的第一个和最后一...
  Java入门实用代码:打印矩形
  更多...
 IPIP: 已设置保密
楼主      
该用户目前不在线 sunweiqin 
  

威望: 0
级别: 高级天王 [荣誉]
魅力: 480
经验: 480
现金: 1128
发文章数: 171
注册时间: 2016-09-12
 消息  查看  搜索  好友  邮件  复制  引用


感谢您的提问。这个范例我都可以编译并运行。不知道您在编译和运行时会遇到什么情况?


package commu;
public class SyncTest {
  public static void main(String args[]) {
    Stack stack1 = new Stack("stack1");
    Producer producer1 = new Producer(stack1,"producer1");
    Consumer consumer1 = new Consumer(stack1,"consumer1");
    Consumer consumer2 = new Consumer(stack1,"consumer2");

    Stack stack2 = new Stack("stack2");
    Producer producer2 = new Producer(stack2,"producer2");
    Producer producer3 = new Producer(stack2,"producer3");
    Consumer consumer3= new Consumer(stack2,"consumer3");


  }
}

/**  生产者线程  */
class Producer extends Thread {
  private Stack theStack;

  public Producer (Stack s,String name) {
    super(name);
    theStack = s;
    start();  //启动自身生产者线程
  }

  public void run() {
    String goods;
    for (int i = 0; i < 200; i++) {
      synchronized(theStack){
        goods="goods"+(theStack.getPoint()+1);
        theStack.push(goods);
      }
      System.out.println(getName()+ ": push " + goods +" to "+theStack.getName());
      yield();
    }
  }
}

/**  消费者线程 */
class Consumer extends Thread {
  private Stack theStack;

  public Consumer (Stack s,String name) {
    super(name);
    theStack = s;  
    start();  //启动自身消费者线程
  }

  public void run() {
    String goods;
    for (int i=0; i < 200; i++) {
      goods = theStack.pop();
      System.out.println(getName() + ": pop " + goods +" from "+theStack.getName());
      yield();
    }
  }
}

/**  堆栈  */
class Stack {
  private String name;
  private String[] buffer=new String[100];
  int point=-1;

  public Stack(String name){this.name=name;}
  public String getName(){return name;}

  public synchronized int getPoint(){return point;}

  public synchronized String pop() {
      this.notifyAll();

      while(point==-1){
        System.out.println(Thread.currentThread().getName()+": wait");
        try{
          this.wait();
        }catch(InterruptedException e){throw new RuntimeException(e);}
      }

      String goods = buffer[point];
      buffer[point]=null;
      Thread.yield();
      point--;
      return goods;
  }
  public synchronized void push(String goods) {  
     this.notifyAll();

     while(point==buffer.length-1){
       System.out.println(Thread.currentThread().getName()+": wait");
       try{
         this.wait();
       }catch(InterruptedException e){throw new RuntimeException(e);}
    }
    point++;
    Thread.yield();
    buffer[point]=goods;
  }

}







发文章时间 2018-04-26 23:15:55
 IPIP: 已设置保密 1 楼     
1页 1条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。