美文网首页
Java线程通信

Java线程通信

作者: 奔跑小电驴 | 来源:发表于2020-02-19 00:33 被阅读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才能拿到锁,才能继续执行,如此往复,实现需求

    相关文章

      网友评论

          本文标题:Java线程通信

          本文链接:https://www.haomeiwen.com/subject/jrrofhtx.html