线程间的同步
等待唤醒机制
线程的wait()方法使用就是放弃了执行资格
等待的线程都存在线程池当中。
方法:只能在现场同步当中使用。下面的方法必须强调监视器
wait();// 可以是当前线程进行等待
notify();// 唤醒操作的线程
notifyAll(); //唤醒所有线程。
当前线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行. 其实就是当前线程锁
练习代码:线程间的唤醒机制
package com.thread.text;
public class thradDay2
{
/**
* @param args
*/
public static void main(String[] args)
{
Res res = new Res();
// 现在我要给他
Thread th1 = new Thread(new Input(res));
Thread th2 = new Thread(new Output(res));
th1.start();
th2.start();
}
}
class Res
{
String name;
String sex;
boolean waitT = false;
// 赋值函数
public synchronized void set(String name, String sex)
{
if (waitT)
{
try
{
this.wait();
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.name = name;
this.sex = sex;
this.waitT = true;
this.notify();
}
/**
* 打印函数
*/
public synchronized void out()
{
if (!waitT)
{
try
{
this.wait();
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(this.name + ">........>" + this.sex);
this.waitT = false;
this.notify();
}
}
/*
* 用于输入的类
*/
class Input implements Runnable
{
private Res res;
int x = 0;
public Input(Res res)
{
this.res = res;
}
public void run()
{
while (true)
{
// 注意这里加的锁。是Output类的字节码。这样可以实现线程间的同步
synchronized (res)
{
if (x == 0)
{
res.set("zhulang", "nan");
} else
{
res.set("朱浪", "女");
}
x = (x + 1) % 2;
res.waitT = true;
res.notify(); // 赋值结束就要唤醒当前线程
}
}
}
}
/*
* 用于输出的类
*/
class Output implements Runnable
{
private Res res;
public Output(Res res)
{
this.res = res;
}
public void run()
{
while (true)
{
synchronized (res)
{
res.out();
}
}
}
}