/**
* 线程通信的例子:使用两个线程打印1-100 线程1,线程2 交替打印
*
* 涉及到的三个方法:
* wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器
* notify():一旦执行此方法,就会唤醒被wait的一个线程,如果有多个线程被wait,就唤醒优先级高的那个
* notifyAll():一旦执行此方法,就会唤醒所有被wait的线程
*
* 说明:
* 1. wait(),notify(),notifyAll()三个方法必须使用在同步代码块或同步方法中
* 2. wait(),notify(),notifyAll()三个方法的调用者必须是同步代码块或同步方法中的同步监视器
* 否则会出现IllegalMonitorStateException异常
* 3. wait(),notify(),notifyAll()三个方法是定义在java.lang.Object类中
* @author rjn
* @create 04-21 12:13
*/
class Number implements Runnable{
private int number = 1;
private Object obj = new Object();
@Override
public void run() {
while (true){
synchronized (obj) {
obj.notify();
if (number <= 100){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + number);
number++;
try {
//使得调用如下wait()方法的线程进入阻塞状态
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
break;
}
}
}
}
}
public class CommunicationTest {
public static void main(String[] args) {
Number number = new Number();
Thread t1 = new Thread(number);
Thread t2 = new Thread(number);
t1.setName("线程1");
t2.setName("线程2");
t1.start();
t2.start();
}
}
线程1:1
线程2:2
线程1:3
线程2:4
线程1:5
线程2:6
线程1:7
线程2:8
线程1:9
线程2:10
线程1:11
线程2:12
线程1:13
线程2:14
线程1:15
线程2:16
线程1:17
线程2:18
线程1:19
线程2:20
线程1:21
线程2:22
线程1:23
线程2:24
线程1:25
线程2:26
线程1:27
线程2:28
线程1:29
线程2:30
线程1:31
线程2:32
线程1:33
线程2:34
线程1:35
线程2:36
线程1:37
线程2:38
线程1:39
线程2:40
线程1:41
线程2:42
线程1:43
线程2:44
线程1:45
线程2:46
线程1:47
线程2:48
线程1:49
线程2:50
线程1:51
线程2:52
线程1:53
线程2:54
线程1:55
线程2:56
线程1:57
线程2:58
线程1:59
线程2:60
线程1:61
线程2:62
线程1:63
线程2:64
线程1:65
线程2:66
线程1:67
线程2:68
线程1:69
线程2:70
线程1:71
线程2:72
线程1:73
线程2:74
线程1:75
线程2:76
线程1:77
线程2:78
线程1:79
线程2:80
线程1:81
线程2:82
线程1:83
线程2:84
线程1:85
线程2:86
线程1:87
线程2:88
线程1:89
线程2:90
线程1:91
线程2:92
线程1:93
线程2:94
线程1:95
线程2:96
线程1:97
线程2:98
线程1:99
线程2:100