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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Johnny_Hu 中级黑马   /  2015-3-26 23:05  /  406 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.Painter.suo;
  2.   
  3. public class InputOutputDemo {
  4.   
  5.     public static void main(String[] args)
  6.     {
  7.         Res r = new Res();
  8.         Input in = new Input(r);
  9.         Output out = new Output(r);
  10.         Thread t1 = new Thread(in);
  11.         Thread t2 = new Thread(out);
  12.         t1.start();
  13.         t2.start();
  14.     }
  15. }
  16.   
  17. class Res
  18. {
  19.     String name;
  20.     String sex;
  21.     boolean flag =false;
  22. }
  23.   
  24. class Input implements Runnable
  25. {
  26.     Res r = new Res();
  27.     int x =0;
  28.     Input(Res r)
  29.     {
  30.         this.r = r;
  31.     }
  32.     public void run()
  33.     {
  34.         while (true)
  35.         {
  36.               
  37.             synchronized(r)
  38.             {
  39.                 if(r.flag)//判断是否为真
  40.                 {
  41.                     try{wait();}catch(Exception e){}//冻结
  42.                 }
  43.                 if(x==0)
  44.                 {
  45.                     r.name="胡平燕";
  46.                     r.sex="男";
  47.                 }
  48.                 else
  49.                 {
  50.                     r.name="Painter";
  51.                     r.sex="man";
  52.                 }
  53.                 x=(x+1)%2;
  54.                 r.flag = true;
  55.                 r.notify();//唤醒机制
  56.             }      
  57.         }
  58.     }
  59. }
  60. class Output implements Runnable
  61. {
  62.     Res r = new Res();
  63.     Output(Res r)
  64.     {
  65.         this.r = r;
  66.     }
  67.     public void run()
  68.     {
  69.         synchronized(r)
  70.         {
  71.             if(!r.flag)
  72.             {
  73.                 try{r.wait();}catch(Exception e){}     
  74.             }
  75.             System.out.println(r.name+"......."+r.sex);
  76.             r.flag = false;
  77.             r.notify();//唤醒机制
  78.         }
  79.          
  80.     }
  81. }
复制代码
​wait();
notify();
notifyAll();
都使用在同步中,因为要对持有监视器(锁)的线程操作
所以要使用在同步中,因为只有在同步中才有锁

为什么这些操作线程的方法要定义在Object类中呢?
因为这些方法在操作同步中线程时,都必须要标识它们所操作线程只有的锁。
只有同一个锁上的被等待线程,可以被同一个notify唤醒。
不可以对不同锁中的线程唤醒
也就是等待和唤醒必须是同一个锁。

而锁可以是任意对象,所以被任意对象调用的方法定义在Object中

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1 总结的不错

查看全部评分

3 个回复

倒序浏览
这种只适用于两个线程,一个生产一个消费的情况。若是两个线程生产两个线程消费,就会发生都冻结的状况。因为notify只能唤醒一个线程,唤醒的是线程池中的第一个线程,可能唤醒的是自己这一方的线程,在那种情况下,应该使用的是notifyAll来唤醒所有的线程,包括对方的和自己这一方的。或者使用Lock和Condition方式来解决,当使用一个Condition对象时,使用await和signalAll.当自己这一方和对方分别使用一个Condition对象await时,就可以使用对应的Condition的signal方法来唤醒对方即可,而不用signal唤醒自己这一方的线程。
回复 使用道具 举报
晕了,线程在项目中,到底会起到什么作用呢,以前也学习个java可是就是没有教我们使用线程,是不是java开发中线程不是那么重要呢?
回复 使用道具 举报
感觉好迷糊。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马