黑马程序员技术交流社区
标题:
等待唤醒机制---线程间通信普通版与优化版
[打印本页]
作者:
追逐
时间:
2014-3-18 19:56
标题:
等待唤醒机制---线程间通信普通版与优化版
本帖最后由 追逐 于 2014-3-21 19:36 编辑
1,普通版
/*
线程间通信
其实就是多个线程在操作同一个资源
只是操作的动作不同
wait();
notify();
notifyAll();
都是用在同步中,因为要对持有监视器(锁)的线程操作。
所以要使用在同步中,因为只有同步才具有锁。
为什么这些操作线程的方法要定义Object类中呢?
因为这些方法在操作同步中线程时,都必须要标识它们所操作线程持有的锁
只有同一个锁上的被等待线程。可以被同一个锁上的notify唤醒
不可以对不同锁中的线程进行唤醒。
也就是说。等待和唤醒必须是同一个锁。
而锁可以是任意对象,所以可以被任意对象调用的方法定义在Object类中
*/
//定义一个资源类
class Person {
String name;
String sex;
boolean b = false; //定义一个标记
}
//定义一个输入类
class Input implements Runnable {
private Person p; //定义一个资源类的对象
Input(Person p) {
this.p = p;
}
//建立run方法
public void run() {
int x = 0;
while(true) {
synchronized(p) { //因为线程出现安全隐患问题。所以加上同步
if(p.b)
//假如标记为真。就wait();进入等待状态
try {p.wait();} catch(InterruptedException e) {}
if(x == 0) {
p.name = "shasha";
p.sex = "girl";
} else {
p.name = "志志";
p.sex = "男";
}
x = (x + 1) % 2;
p.b = true; //把标记改为真。
p.notify(); //唤醒等待的程序
}
}
}
}
//定义一个输出类
class Output implements Runnable {
private Person p;
Output(Person p) {
this.p = p;
}
public void run() {
while(true) {
synchronized(p) { //因为对象p是唯一的。所以把p定义为同步锁
if(!p.b)
try {p.wait();} catch(InterruptedException e) {}
System.out.println(p.name + "run ...." + p.sex);
p.b = false; //把标记改为假
p.notify(); //唤醒等待的线程
}
}
}
}
//定义一个调试类
class InputOutputDemo {
public static void main(String[] args) {
Person p = new Person(); //建立资源类
Input in = new Input(p); //把资源类对象当做实参传递给输入类的构造函数
Output ou = new Output(p); //把资源类对象当做实参传递给输出类的构造函数
Thread t1 = new Thread(in);
Thread t2 = new Thread(ou);
t1.start();
t2.start();
}
}
2,优化后的代码(优化版)
//定义一个资源类
class Person1 {
private String name;
private String sex;
boolean b = false; //定义一个标记
//在资源类中定义一个赋值函数,但是有可能在赋值的时候出现问题。所以使用同步,变成同步函数
public synchronized void set(String name, String sex) {
if(b)
//假如标记为真。就wait();进入等待状态
try {this.wait();} catch(InterruptedException e) {}
this.name = name;
this.sex = sex;
this.b = true;
this.notify();
}
public synchronized void out() {
if(!b)
try {this.wait();} catch(InterruptedException e) {}
System.out.println(name + "run......" + sex);
this.b = false;
this.notify();
}
}
//定义一个输入类
class Input1 implements Runnable {
private Person1 p; //定义一个资源类的对象
Input1(Person1 p) {
this.p = p;
}
//建立run方法
public void run() {
int x = 0;
while(true) {
if(x == 0) {
p.set("meimei", "girl");
} else {
p.set("志志", "男");
}
x = (x + 1) % 2;
}
}
}
//定义一个输出类
class Output1 implements Runnable {
private Person1 p;
Output1(Person1 p) {
this.p = p;
}
public void run() {
while(true) {
p.out();
}
}
}
//定义一个调试类
class InputOutputDemo1 {
public static void main(String[] args) {
Person1 p = new Person1();
new Thread(new Input1(p)).start();
new Thread(new Output1(p)).start();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2