多线程-线程间的通信

线程间的通信

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

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

原文地址:https://www.cnblogs.com/Z-Dey/p/12895992.html