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

浙公网安备 33010602011771号