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();
}
}
/*
* 等待/唤醒机制
* 涉及的方法:
* 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();
}
}