本文解决进程的同步问题,并且实现进程交替进行
代码如下
package Test;
//线程通信 交替打印数字
/**
* wait()进入阻塞,并释放同步监视器
* notify()唤醒一个wait线程
* notifyAll唤醒所有的wait线程
*
* 只能使用在同步代码块或同步方法中
*/
class Number implements Runnable{
private int num=1; //共享数据
@Override
public void run() {
while (true)
synchronized (this){ //this是一个Number,任意一个对象都可以充当同步监视器
notify(); //唤醒
if(num<=100){
System.out.println(Thread.currentThread().getName()+" 打印结果 "+num);
num++;
try {
wait(); //调用wait进入阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
break;
}
}
}
}
public class CommunicateTest {
public static void main(String[] args) {
Number number=new Number();
Thread t1=new Thread(number);
Thread t2=new Thread(number);
t1.setName("线程1");
t2.setName("线程2");
t1.start();
t2.start();
}
}
要点:1.解决线程同步问题,加了一个synchronized代码块,把run方法中要执行的内容包裹起来,注意== 需要传入一个对象作为同步监视器 ==
2.解决线程通信(交互打印):主要使用到了两个方法notify()和wait()。notify方法用来唤醒被wait()阻塞的进程。调用了wait()方法则进入阻塞,并且释放同步监视器
sleep和wait方法的异同
相同点:都会使得线程阻塞
不同点:1.声明的位置不同,Thread类中声明sleep,Object类中声明wait
2.调用要求不同,sleep可以在任何场景下调用,而wait只能在同步代码块或者同步方法中调用
3.关于是否释放同步监视器:sleep不释放,wait释放
== 任何线程进入同步代码块、同步方法之前,必须先获得对于同步监测器的锁定==