多线程-线程间的通信
线程间的通信
线程通信就是线程与线程间进行信息的交换。
这里可以举个例子,两个线程交替的打印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()方法必须在同步方法或者同步代码块中使用。
有道无术,术可求;有术无道,止于术。