中关村黑马程序员训练营 ------- 多线程间通讯及多线程等待唤醒机制

中关村黑马程序员训练营   ——- 多线程间通讯及多线程等待唤醒机制

.——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

多线程间通讯: 其实就是多个线程在操作同一个资源, 但是操作的动作不同。
多线程等待唤醒机制
两个线程在操作同一个共享数据资源时。一个线程执行运行数据资源时,另一线程等着不能动
1.要用到监视器锁 wait() notify(); notifyAll(); 都使用在同步中,因为要对持有监视器(锁)的线程操作。
所以要使用在同步中,因为只有同步才具有锁。
2. wait() notify(); notifyAll() 这些操作线程的方法要定义Object类中
这些方法在操作同步中线程时,都必须要标识它们所操作线程的锁,只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒。不可以对不同锁中的线程进行唤醒。 线程1input 线程2output 要共用同一个锁,把obj作为锁不成立 因为 线程1input 线程2output 都各自有自己的this 也不行 线程1input 有自己的本类对象Input in = new Input(); 线程2output 有自己的本类对象 Output ou = new Output()本类对象各个不同
3.在内存里有四个类Res Input Output DanLi 他们对应的class字节码也有是个 Res.class Input.class Output.class DanLi.class
任意哪一个作为对象锁都行 不唯一 所以要找一个唯一的对象锁 只有 Res r = new Res();是唯一的对象所 就用 r作为锁

// 建立个共享的资源库 里面有属性变量 Sring 那么 Sring sex
class Res
{
//默认的构造函数
//Res r = new Rew();
String name ;
String sex;
}

//class Input与 class Output 都在调用类 Res的对象 不能保证对象的唯一性
class Input implements Runnable
{
Object obj = new Object();
//Res r = new Res();

// 建立构造函数 Input(Res r) 往里传入参数列表 Res(类型) r(变量) Res r 引用 Input(Res r)初始化
private Res r;
Input(Res r)
{
this.r = r;
}

public void run()                   
  {                                         
     while(true)
      {
        int x = 0; 

 synchronized (r)  //
          {
      if(x == 0)
        {
       // 对 强强 和 丽丽  这两个人实行切换输出打印 
          r.name = "强强";               
          r.sex = "男"; 
           System.out.println(r.name+"......................"+r.sex);
         }

      else
        {  r.name = "丽丽";
           r.sex = "女"; 
            System.out.println(r.name+"...................."+r.sex);

         }

        x = (x+1)%2;  
      }
     }
    }

}

class Output implements Runnable
{
Object obj = new Object();
//Res r = new Res();
private Res r;
Output(Res r)
{
this.r = r;
}

public void run()
  {
    while(true)          
      { //r.name; //r.sex;
          synchronized(r)     
 System.out.println(r.name+" ::"+r.sex);

}
}
}

}

class DanLi
{
public static void main(String[] args)
{
//首先现有资源 class Res 建立资源类的对象Res r = new Res()

     Res r = new Res(); 

     //子线程 Input 实现了run() 要建立子线程对象 Input in = new Input(r)   
     Input in = new Input(r);

     //子线程 Output 实现了run() 要建立子线程对象 Output in = new Output(r)  
     Output ou = new Output(r);

         Thread t1 = new Thread(in);             //创建线程t1 new Thread(in)   input(r) 传进去 

           t1.start();                  //开启线程t1 运行 Input 的run()方法   运行 input(r)

           Thread t2 = new Thread(ou);   //创建线程t2   高数公路new Thread(ou) output(r) 传进去 

           t2.start();                    //开启线程t2 运行 Output 的run()方法   运行output(r) 


    System.out.println("主线程..............");
}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值