0
点赞
收藏
分享

微信扫一扫

【Java笔记】线程的通信

ITWYY 2022-04-01 阅读 61

“通信” 就好比 “交流”,目的是通过一定手段让多个线程之间的执行有了一种秩序,而不是随即执行

目录

线程通信的三个方法

对三个方法的说明

sleep( )和wait( )的异同

通信代码举例


线程通信的三个方法

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();
}
}
举报

相关推荐

0 条评论