java线程wait函数到底是如何实现的

	private final static Lock lock = new ReentrantLock();
	private final static Condition cond = lock.newCondition();

    public void run() {
			while (!Thread.currentThread().isInterrupted()) {
				try {
					lock.lock();//换成读写锁
					doSomething();
					cond.await();
				} catch (InterruptedException e) {
					Thread.currentThread().interrupt();
				} finally {
					lock.unlock();
				}
			}
		}

如上,当我们调用cond.await();JDK底层调用了LockSupport.park,JVM调用了操作系统posix接口pthread_cond_wait(&cond,mutex)函数。

这个函数将线程加入等待队列中,并让线程睡眠。通过for(::)函数检查&cond是否满足,来唤醒等待队列的线程。

do {                                                                             \

         DEFINE_WAIT(__wait);                                                  \

                                                                                    \

         for (;;) {                                                             \

                   prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE);    \

                   if (condition)                                                   \

                            break;                                                     \

                   if (!signal_pending(current)) {                             \

                            schedule();                                             \

                            continue;                                      \

                   }                                                                \

                   ret = -ERESTARTSYS;                                              \

                   break;                                                               \

         }                                                                         \

         finish_wait(&wq, &__wait);                                         \

} while (0)

如上图,操作系统循环调用条件是否满足函数,判断是否唤醒当前线程。与我的初衷想法是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三月泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值