Java 等待/唤醒机制

package day14;
/*
 * 等待/唤醒机制
 * 涉及的方法:
 * 1、wait();让线程处于冻结状态,被wait的线程会被存储到线程池中。
 * 2、notify();唤醒线程池中一个线程(任意)。
 * 3、notifyAll():唤醒线程池中的所有线程。
 * 
 * 这些方法都必须定义在同步中。
 * 因为这些方法是用于操作线程状态的方法。
 * 必须要明确到底操作的是哪个锁上的线程。
 * 
 * 为什么操作线程的方法wait notify notifyAll 定义在了Object类中。
 * 因为这些方法时监视器的方法。监视器其实就是锁。
 * 锁可以是任意的对象,任意的对象调用的方式一定定义在Object类中。 
 * 
 * 
 */
class Resource{
String name;
String sex;
boolean flag = false;
}


//输入
class Input implements Runnable{
Resource r;
// Object obj = new Object();
Input(Resource r){
this.r = r;
}

public void run(){
int x = 0;
while(true){
synchronized(r){
if(r.flag)
try {
r.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(x==0){
r.name = "mike";
r.sex = "男";
}
else{
r.name = "丽丽";
r.sex = "女";
}
r.flag  = true;
r.notify();
}
x = (x+1)%2;
}
}
}




//输出
class Output implements Runnable{
Resource r;
// Object obj = new Object();
Output(Resource r){
this.r = r;
}

public void run(){
while(true){
synchronized(r){
if(!r.flag)
try {
r.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(r.name + "......" + r.sex);
r.flag = false;
r.notify();
}
}
}
}

public class ResourceDemo2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Resource r = new Resource();
Input in = new Input(r);
Output out = new Output(r);

Thread t1 = new Thread(in);
Thread t2 = new Thread(out);
t1.start();
t2.start();
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值