“通信” 就好比 “交流”,目的是通过一定手段让多个线程之间的执行有了一种秩序,而不是随即执行
目录
线程通信的三个方法
wait() | 使当前线程就会进入阻塞状态,并释放同步监视器 |
notify() | 唤醒被 wait()的一个线程,如果有多个线程被 wait(),就唤醒优先级高的线程 |
notifyAll() | 唤醒所有被 wait()的线程 |
对三个方法的说明
1. 三个方法必须使用在同步代码块或同步方法中
2. 三个方法的调用者必须是同步代码块或同步方法中的同步监视器,否则会出现异常
3. 三个方法都定义在 java . lang . Object 类中
sleep( )和wait( )的异同
相同点:一旦执行方法,都可以使得当前的线程进入阻塞状态
不同点:1. 两个方法声明的位置不同:Thread 类中声明 sleep(),Object 类中声明 wait()
2. 调用的要求不同:sleep()可以在任何需要的场景下调用。wait()必须使用在同步 代码块或同步方法中
3. 关于是否释放同步监视器:如果两个方法都使用在同步代码块或同步方法中,sleep ()不会释放锁,wait()会释放锁
通信代码举例
// 产生两个线程交替打印的效果
class Number implements Runnable{
private int number = 1;
@Override
public void run() {
while (true) {
synchronized (this) {
notify(); // 唤醒等待线程
if (number <= 100) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + number);
number++;
try {
// 使得调用如下 wait() 方法的线程进入阻塞状态
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
break;
}
}
}
}
}
public class tongXinTest {
public static void main(String[] args) {
Number n = new Number();
Thread t = new Thread(n);
Thread t1 = new Thread(n);
t.start();
t1.start();
}
}