• 多线程-线程间的通信


    线程间的通信

    线程通信就是线程与线程间进行信息的交换。

    这里可以举个例子,两个线程交替的打印0-9这10个数字。
    首先分析一下,比如线程一先开始打印,当它打印了数字0后,他应该等待线程二打印数字1,线程二打印了之后又要等待线程一打印数字2...
    那怎么样才能让线程一开始等待呢?这里可以使用Object类中的wait()方法。

    代码演示:

    public class ThreadTest5 {
    
        public static void main(String[] args) {
            Number number = new Number();
    
            Thread t1 = new Thread(number,"小明");
            Thread t2 = new Thread(number,"小红");
    
            t1.start();
            t2.start();
        }
    
    }
    class Number implements Runnable{
    
        private int num = 1;
    
        @Override
        public void run() {
            while (true){
                synchronized(this) {
                    //notify();//唤醒线程,让线程进入就绪状态等待CPU调度
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if (num < 10) {
                        System.out.println(Thread.currentThread().getName() + num++);
                        try {
                            wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    } else {
                        break;
                    }
                }
            }
        }
    }
    
    

    如果只有wait()方法,那么两个线程都会进入阻塞状态。

    所以需要使用notify()或notifyAll()来唤醒线程,让他们进入就绪状态。
    如果有多个线程进行打印,那么需要使用notifyAll()方法。

    notif()方法会唤醒一个阻塞状态的线程,如果有多个线程是阻塞状态,会唤醒优先级高的线程。
    notifyAll()方法会将所有的阻塞状态的线程唤醒。
    wait()方法会让线程进入阻塞状态并释放当前的锁对象。

    注意:wait()、notify()和、notifyAll()方法必须在同步方法或者同步代码块中使用。

  • 相关阅读:
    SDOI2017 R2泛做
    类似静态区间逆序对的题的一些做法
    友链&&日记
    注意事项以及一些奇怪的姿势
    关于各种算法以及好的blog的整理(持续更新)
    PKUSC2019游记
    洛谷P5398 [Ynoi2018]GOSICK(二次离线莫队)
    洛谷P4887 第十四分块(前体)(二次离线莫队)
    [51nod]1678 lyk与gcd(莫比乌斯反演)
    LOJ#557. 「Antileaf's Round」你这衣服租来的吗(FHQ Treap+珂朵莉树)
  • 原文地址:https://www.cnblogs.com/Z-Dey/p/12895992.html
Copyright © 2020-2023  润新知