并发编程(6)线程间通信

一.等待唤醒机制(wait,notify,notifyAll)

1.基本概念

        wait:将同步线程处于冻结状态,释放执行权,同时将线程对象存储到线程池

        notify:唤醒线程池中某个等待线程

        notifyAll:唤醒线程池中所有线程

2.注意

    (1)这些方法都需要定义在同步中

    (2)这些方法必须要标示所属的锁

    (3)为什么这三个方法要被定义在object中?因为这三个方法都需要被同步锁调用,而锁可以是任意对象,那么能被任意对象调用的方法一定在Object类中

3.wait和sleep的区别?

    (1)wait可以指定时间,也可以不指定时间,不指定时间只能由notify或notifyAll唤醒,sleep必须指定时间

    (2)wait线程会释放执行权和锁,sleep只会释放执行权,不会释放锁

扫描二维码关注公众号,回复: 2015408 查看本文章
public class Demo3 {

    private volatile int signal;

    public void set(int signal) {
        this.signal = signal;
    }

    public int get(){
        return signal;
    }

    public static void main(String[] args) {
        Demo3 d = new Demo3();

        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (d){
                    System.out.println("修改状态的线程执行...");
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    d.set(1);
                    d.notify();
                }

            }
        }).start();

        new Thread(new Runnable() {

            @Override
            public void run() {
                synchronized (d){
                    while (d.get() != 1){
                        try {
                            d.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("模拟代码执行...");
                }

            }
        }).start();
    }
}

二.加塞线程 join

    B.join():在线程A中调用B.join,直到线程B结束之后才会调用线程A

    B.join(1000):线程A等待线程B执行一秒后继续进入可运行状态


猜你喜欢

转载自blog.csdn.net/qq_34645958/article/details/80965910