| 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) ; } 
 (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |