A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lovewyy 初级黑马   /  2014-7-3 20:26  /  1258 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

3黑马币

package demo8;
import java.util.Scanner;
class Processor {
public Object lock = new Object();

public void comsumer() {
  System.out.println("coming into producer");
  Scanner scan = new Scanner(System.in);
  try {
   Thread.sleep(2000);
  } catch (InterruptedException e1) {
   e1.printStackTrace();
  }
  
  synchronized (this) {//这里改为lock对象运行会出错,没搞明白
   System.out.println("put a word to run notify() : ");
   scan.nextLine();
   notify();
   System.out.println("after notify()");
   
   try {
    Thread.sleep(3000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }

  System.out.println("after three seconds");
}
public void producer() {
  synchronized (this) {//这里改为lock对象运行会出错,没搞明白
   System.out.println("coming into comsumer");
   try {
    wait();
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   System.out.println("after wait");
  }
}
}
public class App {
public void doWork() {
  
  final Processor processor = new Processor();
  
  Thread thread1 = new Thread(new Runnable() {
   @Override
   public void run() {
    // TODO Auto-generated method stub
    processor.producer();
   }
  });
  Thread thread2 = new Thread(new Runnable() {
   @Override
   public void run() {
    // TODO Auto-generated method stub
    processor.comsumer();
   }
  });
  thread1.start();
  thread2.start();
}
public static void main(String[] args) {
  App app = new App();
  app.doWork();
}
}
这个代码可以直接运行,问题在请看代码注释。

最佳答案

查看完整内容

wait() 和 notify() 都是object中的方法,是对象锁!直接调用,其实暗含了一个this,锁的对象是processor (final Processor processor = new Processor();),而你同步的是lock这个对象。在使用lock对象的时候,修改为lock.wait();和lock.notify();就可以正常运行。 望采纳

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

2 个回复

倒序浏览
wait() 和 notify()  都是object中的方法,是对象锁!直接调用,其实暗含了一个this,锁的对象是processor (final Processor processor = new Processor();),而你同步的是lock这个对象。在使用lock对象的时候,修改为lock.wait();和lock.notify();就可以正常运行。

望采纳

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
android0276 发表于 2014-7-3 20:27
wait() 和 notify()  都是object中的方法,是对象锁!直接调用,其实暗含了一个this,锁的对象是processor  ...

我按你的思路试了一下,正解,分给你吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马