Java线程通信
例子:连个线程交替打印1~100
终端输出
t1:1
t2:2
t1:3
t2:4
t1:5
...
其实这就是两个线程之间互相通信才能产生的结果,否则是不会如此规律的实现上述需求,只有线程t1打印完"1",通知线程t2,t2打印"2",再通知t1,如此往复才能实现,这个【通知】,即为线程通信
代码实现:
class Number implements Runnable{
private int number = 1;
@Override
public void run() {
while (true){
synchronized (this) {
//notify唤醒被wait的线程,如有多个wait的线程,则唤醒优先级高的
//notifyAll唤醒所有wait的线程
notify();
if (number < 100) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(
Thread.currentThread().getName() + ":" + number);
number++;
try {
//使得调用wait方法的线程进入阻塞,wait会释放锁
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
break;
}
}
}
}
}
public class Communicate {
public static void main(String[] args) {
Number number = new Number();
Thread t1 = new Thread(number);
Thread t2 = new Thread(number);
t1.setName("T1");
t2.setName("T2");
t1.start();
t2.start();
}
}
代码中的注释已经简单的写下了通信的原理
1.wait()方法将当前线程所占用的锁释放,同时进入阻塞状态
2.notify()方法唤醒被wait()的线程
3.notifyAll()唤醒所有wait()的线程
这样,上述的例子就是t1打印完1,进入wait()阻塞状态同时释放锁,然后t2拿到锁,唤醒t1,这时候虽然t1被唤醒,但是由于唯一的锁正在被t2持有,所以还是要等到t2执行完,进入wait(),t1才能拿到锁,才能继续执行,如此往复,实现需求
网友评论