Java线程通信

2020-02-19  本文已影响0人  奔跑小电驴

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才能拿到锁,才能继续执行,如此往复,实现需求

上一篇 下一篇

猜你喜欢

热点阅读