wait简单使用

线程中的简单通信可以通过wait和notify来实现,它们都是object的方法

  • wait() - 方法wait()的作用是使当前执行代码的线程进行等待,它是Object类的方法,该方法用来将当前线程置入预执行队列中,并且在wait所在的代码行处停止执行,直到接到通知或被中断为止。
    在调用wait方法之前,线程必须获得该对象的对象级别锁,即只能在同步方法或同步块中调用wait方法。

  • notify() - 同wait方法一样,也需要在同步方法或同步块中调用,即在调用前,线程也必须获得该对象的对象级别锁。

wait和notify调用时,如果没有用被锁的对象调用,将会抛出IllegalMonitorStateException的异常。它是一个RuntimeException的子类。

 

public class studyWait {

    public static void main(String[] args) {
        Object lock = new Object();
        Object wlock = new Object();
        WaitThread w1 = new WaitThread(lock,"s线程1");
        w1.start();
/*        Object wlock2 = new Object();
        WaitThread w2 = new WaitThread(lock,"s线程2");
        w2.start();*/
        NotifyThread t2 = new NotifyThread(lock,"n线程1");
        t2.start();
    }
}

class NotifyThread extends Thread {
    private final Object lock;
    private String name;

    public NotifyThread(Object lock,String name) {
        super();
        this.lock = lock;
        this.name = name;
    }

    @Override
    public void run() {
        synchronized (lock) {
            // 业务逻辑完成了...
            System.out.println(name+"开始 notify time= " + System.currentTimeMillis());
            // 做一些业务逻辑相关的事。。。。
            try {
                Thread.sleep(3000);
            } catch (Exception e) {
                e.printStackTrace();
            }
            lock.notifyAll();
            System.out.println(name+"结束 notify time= " + System.currentTimeMillis());
        }
    }
}


class WaitThread extends Thread {
    private final Object lock;
    private String name;

    public WaitThread(Object lock,String name) {
        super();
        this.lock = lock;
        this.name = name;
    }

    @Override
    public void run() {
        try {
            synchronized (lock) {
                long start = System.currentTimeMillis();
                System.out.println(name+"开始 wait time= " + start);
                Thread.sleep(3000);
                System.out.println(name+"wait 休眠 3000ms");
                lock.wait();
                long end = System.currentTimeMillis();
                System.out.println(name+"结束 wait time= " + end);
                System.out.print(name+"wait time = " + (end - start));
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

运行结果:

D:\Java\jdk1.8.0_131\bin\java "-javaagent:E:\JetBrains\IntelliJ IDEA 2017.3.1\lib\idea_rt.jar=61765:E:\JetBrains\IntelliJ IDEA 2017.3.1\bin" -Dfile.encoding=UTF-8 -classpath D:\Java\jdk1.8.0_131\jre\lib\charsets.jar;D:\Java\jdk1.8.0_131\jre\lib\deploy.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;D:\Java\jdk1.8.0_131\jre\lib\javaws.jar;D:\Java\jdk1.8.0_131\jre\lib\jce.jar;D:\Java\jdk1.8.0_131\jre\lib\jfr.jar;D:\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;D:\Java\jdk1.8.0_131\jre\lib\jsse.jar;D:\Java\jdk1.8.0_131\jre\lib\management-agent.jar;D:\Java\jdk1.8.0_131\jre\lib\plugin.jar;D:\Java\jdk1.8.0_131\jre\lib\resources.jar;D:\Java\jdk1.8.0_131\jre\lib\rt.jar;D:\workspring\studyWork\study1\out\production\study1 studyWait
s线程1开始 wait time= 1605673739807
s线程1wait 休眠 3000ms
n线程1开始 notify time= 1605673742807
n线程1结束 notify time= 1605673745808
s线程1结束 wait time= 1605673745808
s线程1wait time = 6001
Process finished with exit code 0

 

posted @ 2020-11-18 12:32  xujf  Views(774)  Comments(0)    收藏  举报