多线程-线程间的通信

Posted z-dey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程-线程间的通信相关的知识,希望对你有一定的参考价值。

线程间的通信

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

这里可以举个例子,两个线程交替的打印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()方法必须在同步方法或者同步代码块中使用。

以上是关于多线程-线程间的通信的主要内容,如果未能解决你的问题,请参考以下文章

多线程-线程间的通信

多线程---线程间的通信

JUC高级多线程_02:线程间的通信

iOS开发多线程篇—线程间的通信

Java基础教程:多线程基础——线程间的通信

iOS开发多线程篇—线程间的通信