park方法在os_linux.cpp中(其他操作系统的实现在os_xxx中)
- void Parker::park(bool isAbsolute, jlong time) {
- ...
- //获得当前线程
- Thread* thread = Thread::current();
- assert(thread->is_Java_thread(), "Must be JavaThread");
- JavaThread *jt = (JavaThread *)thread;
- //如果当前线程被设置了interrupted标记,则直接返回
- if (Thread::is_interrupted(thread, false)) {
- return;
- }
- if (time > 0) {
- //unpacktime中根据isAbsolute的值来填充absTime结构体,isAbsolute为true时,time代表绝对时间且单位是毫秒,否则time是相对时间且单位是纳秒
- //absTime.tvsec代表了对于时间的秒
- //absTime.tv_nsec代表对应时间的纳秒
- unpackTime(&absTime, isAbsolute, time);
- }
- //调用mutex trylock方法
- if (Thread::is_interrupted(thread, false) || pthread_mutex_trylock(_mutex) != 0) {
- return;
- }
- //_counter是一个许可的数量,跟ReentrantLock里定义的许可变量基本都是一个原理。 unpack方法调用时会将_counter赋值为1。
- //_counter>0代表已经有人调用了unpark,所以不用阻塞
- int status ;
- if (_counter > 0) { // no wait needed
- _counter = 0;
- //释放mutex锁
- status = pthread_mutex_unlock(_mutex);
- return;
- }
- //设置线程状态为CONDVAR_WAIT
- OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
- ...
- //等待
- _cur_index = isAbsolute ? ABS_INDEX : REL_INDEX;
- pthread_cond_timedwait(&_cond[_cur_index], _mutex, &absTime);
- ...
- //释放mutex锁
- status = pthread_mutex_unlock(_mutex) ;
- }
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|