Thread等待唤醒机制
* wait()
* notify()
* notifyAll()
* 都使用在同步中,因为要对持有监视器(锁)的线程操作。
* 所以要是用在同步中,因为只 有同步才具有锁
*
* 为什么这些操作线程的方法要定义在object类中?
* 因为这些方法在操作同步线程时,都必须要标识它们所操作线程只有的锁,
* 只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒/
* 不可以对不同所中的线程进行唤醒。
* 也就是说等待和唤醒是同一个锁。
*
* 而锁可以是任意对象,所以可以被任意对象调用的方法定义在object类中
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------
* wait()
* notify()
* notifyAll()
* 都使用在同步中,因为要对持有监视器(锁)的线程操作。
* 所以要是用在同步中,因为只 有同步才具有锁
*
* 为什么这些操作线程的方法要定义在object类中?
* 因为这些方法在操作同步线程时,都必须要标识它们所操作线程只有的锁,
* 只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒/
* 不可以对不同所中的线程进行唤醒。
* 也就是说等待和唤醒是同一个锁。
*
* 而锁可以是任意对象,所以可以被任意对象调用的方法定义在object类中
public class Demo5 {
public static void main(String[] args) {
Res r = new Res();
input input = new input(r);
output output = new output(r);
Thread in = new Thread(input);
Thread out = new Thread(output);
in.start();
out.start();
}
}
class Res {
boolean fall = false;
String name;
String sex;
}
class input implements Runnable {
private Res r;
public input(Res r) {
this.r = r;
}
public void run() {
int x = 0;
while (true) {
synchronized (r) {
if (r.fall)
try {
r.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (x == 0) {
r.name = "张三";
r.sex = "女";
} else {
r.name = "maikl";
r.sex = "man";
}
x = (x + 1) % 2;
r.fall = true;
r.notify();
}
}
}
}
class output implements Runnable {
private Res r;
public output(Res r) {
this.r = r;
}
public void run() {
while (true) {
synchronized (r) {
if (!r.fall)
try {
r.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(r.name + "=====" + r.sex);
r.fall = false;
r.notify();
}
}
}
}
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------