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 条评论