三个线程间的通讯(二)
1、示例代码如下:
package com.jh.www;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class Demo3 {
public static void main(String[] args) {
Printer1 p = new Printer1();
new Thread () {
public void run() {
while(true) {
try {
p.print1();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}}.start();
new Thread () {
public void run() {
while(true) {
try {
p.print2();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}}.start();
new Thread () {
public void run() {
while(true) {
try {
p.print3();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}}.start();
}
}
class Printer1{
private int flag=1;
ReentrantLock r = new ReentrantLock();
Condition c1 = r.newCondition();
Condition c2 = r.newCondition();
Condition c3 = r.newCondition();
public void print1() throws InterruptedException{
r.lock();
while (flag!=1) {
c1.await();
}
System.out.print("你");
System.out.print("好");
System.out.print("陌");
System.out.print("生");
System.out.print("人");
System.out.print("\r\n");
flag=2;
c2.signal();
r.unlock();
}
public void print2() throws InterruptedException{
r.lock();
while (flag!=2) {
c2.await();
}
System.out.print("我");
System.out.print("爱");
System.out.print("你");
System.out.print("北");
System.out.print("京");
System.out.print("\r\n");
flag=3;
c3.signal();
r.unlock();
}
public void print3() throws InterruptedException{
r.lock();
while (flag!=3) {
c3.await();
}
System.out.print("我");
System.out.print("也");
System.out.print("爱");
System.out.print("你");
System.out.print("\r\n");
flag=1;
c1.signal();
r.unlock();
}
}
2、备注:
1)、wait方法必须是所对象调用
2)、wait和sleep的区别:
a:sleep需要传参数,到时间自己醒,wait可以有参数也可以没有参数,如果有参数就在设定的时间后等待;
b:sleep不释放锁,wait释放锁;
3)、wait和notify方法为什么要放在Object类中?
因为锁对象可以是任意的,而Object是所有类的基本类;