下面一个例子,一个线程"waiting"在同步代码块调用了Object#wait()方法,另一个线程"timedWaiting"调用了Object#wait(3000)等待3000ms,主线程sleep 5000ms后唤醒所有线程。
import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; /** * @see Object#wait(long) 等待对应的毫秒数(不为0)或者被唤醒,执行后续代码 * @see Object#wait() 只有被唤醒(底层源码调用wait 0 ms)才能执行后续代码 * @author rhyme * @date 2020/5/30 11:38 */ @Slf4j public class ObjectWaitMain { private static final Object lock = new Object(); private static final Runnable waiting = () -> { synchronized (lock) { try { log.info("Thread: {}, will Object#wait()", Thread.currentThread().getName()); lock.wait(); log.info("Thread: {} is notified.", Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } } }; private static final Runnable timedWaiting = () -> { synchronized (lock) { try { log.info( "Thread: {}, will be notified or wait 3000 milliseconds.", Thread.currentThread().getName()); lock.wait(3000); log.info( "Thread: {}, after being notified or wait 3000 milliseconds.", Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } } }; public static void main(String[] args) throws InterruptedException { CompletableFuture.allOf( CompletableFuture.runAsync(waiting), CompletableFuture.runAsync(timedWaiting)); // 主线程sleep5000ms,当3000ms后"timedWaiting"线程执行"wait(3000)"后的代码块 // 如果"timedWaiting"线程在3000ms被notify,那么会立即执行后续代码,不会wait 3000ms TimeUnit.MILLISECONDS.sleep(5000); synchronized (lock) { log.info("main will notifyAll waiting thread."); lock.notifyAll(); } log.info("main end."); } /* 输出结果如下: 15:00:36.524 [ForkJoinPool.commonPool-worker-2] INFO com.xy.java.basic.demos.objectwait.ObjectWaitMain - Thread: ForkJoinPool.commonPool-worker-2, will be notified or wait 3000 milliseconds. 15:00:36.527 [ForkJoinPool.commonPool-worker-9] INFO com.xy.java.basic.demos.objectwait.ObjectWaitMain - Thread: ForkJoinPool.commonPool-worker-9, will Object#wait() 15:00:39.528 [ForkJoinPool.commonPool-worker-2] INFO com.xy.java.basic.demos.objectwait.ObjectWaitMain - Thread: ForkJoinPool.commonPool-worker-2, after being notified or wait 3000 milliseconds. 15:00:41.523 [main] INFO com.xy.java.basic.demos.objectwait.ObjectWaitMain - main will notifyAll waiting thread. 15:00:41.523 [main] INFO com.xy.java.basic.demos.objectwait.ObjectWaitMain - main end. 15:00:41.523 [ForkJoinPool.commonPool-worker-9] INFO com.xy.java.basic.demos.objectwait.ObjectWaitMain - Thread: ForkJoinPool.commonPool-worker-9 is notified. */ }
Object#wait(long) 等待对应的毫秒数(不为0)或者被唤醒后,执行后续代码;
Object#wait() 只有被唤醒后(底层源码调用wait 0 ms)才能执行后续代码。
源码如下:
public final void wait() throws InterruptedException { wait(0); }
public final native void wait(long timeout) throws InterruptedException;
Object#wait()与Object#wait(long)的区别
原文:https://www.cnblogs.com/theRhyme/p/12992852.html