两个线程间通信
1.什么时候需要通信
多线程并发执行时,在默认情况下CPU是随机切换线程,如果我们希望他们有规律执行,需要使用通信
2.怎么通信
希望线程等待用wait()
唤醒等待的线程用notify()
这两个方法必须在同步代码块中执行,且使用对象锁来调用
package javastudy01;
public class notify {
public static void main(String[] args) {
printer3 p = new printer3();
new Thread(){
public void run(){
while(true){
try {
p.printer1();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
new Thread(){
public void run(){
while(true){
try {
p.printer2();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
}
//等待唤醒机制,实现交替输出
class printer3 {
private int flag =1;
public void printer1() throws InterruptedException{
synchronized(this){
if(flag!=1){
this.wait();
}
System.out.print("我");
System.out.print("是");
System.out.print("胡");
System.out.print("博");
System.out.print("士\n");
flag =2;
this.notify();
}
}
public void printer2() throws InterruptedException{
synchronized(this){
if(flag!=2){
this.wait(); //当前线程等待
}
System.out.print("同");
System.out.print("步");
System.out.print("代");
System.out.print("码");
System.out.print("块\n");
flag =1;
this.notify(); //随机唤醒单个等待的线程
}
}
}
运行结果
3.一些注意事项
1 在同步代码块中,用哪个对象锁,就用哪个对象锁来调用wait方法
2 为什么wait和notify这些方法定义在object类中
锁对象可以是任意对象,那么任意对象对应的类都是object的子类,object是所有类基类
所有定义在object中,可以让任意对象对其进行调用
3 sleep与wait区别
sleep在同步代码块或同步函数中,在睡眠时不释放锁,而wait释放锁
sleep方法必须传入时间参数,但wait不用传入