首页 > 其他 > 详细

Object#wait()与Object#wait(long)的区别

时间:2020-05-30 15:59:04      阅读:54      评论:0      收藏:0      [点我收藏+]

例子

下面一个例子,一个线程"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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!