condition.html

来自「j2se5-api-zh,java文档的中文版本」· HTML 代码 · 共 546 行 · 第 1/3 页

HTML
546
字号
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><!--NewPage--><HTML><HEAD><!-- Generated by javadoc (build 1.5.0_03) on Wed Nov 02 09:51:59 CST 2005 --><META http-equiv="Content-Type" content="text/html; charset=gb2312"><TITLE>Condition (Java 2 Platform SE 5.0)</TITLE><META NAME="keywords" CONTENT="java.util.concurrent.locks.Condition interface"><LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style"><SCRIPT type="text/javascript">function windowTitle(){    parent.document.title="Condition (Java 2 Platform SE 5.0)";}</SCRIPT><NOSCRIPT></NOSCRIPT></HEAD><BODY BGCOLOR="white" onload="windowTitle();"><!-- ========= START OF TOP NAVBAR ======= --><A NAME="navbar_top"><!-- --></A><A HREF="#skip-navbar_top" title="跳过导航链接"></A><TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""><TR><TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"><A NAME="navbar_top_firstrow"><!-- --></A><TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">  <TR ALIGN="center" VALIGN="top">  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>概述</B></FONT></A>&nbsp;</TD>  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>软件包</B></FONT></A>&nbsp;</TD>  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>类</B></FONT>&nbsp;</TD>  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/Condition.html"><FONT CLASS="NavBarFont1"><B>使用</B></FONT></A>&nbsp;</TD>  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>树</B></FONT></A>&nbsp;</TD>  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>已过时</B></FONT></A>&nbsp;</TD>  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-files/index-1.html"><FONT CLASS="NavBarFont1"><B>索引</B></FONT></A>&nbsp;</TD>  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>帮助</B></FONT></A>&nbsp;</TD>  </TR></TABLE></TD><TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM><b>Java<sup><font size=-2>TM</font></sup>&nbsp;2&nbsp;Platform<br>Standard&nbsp;Ed. 5.0</b></EM></TD></TR><TR><TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">&nbsp;<A HREF="AbstractQueuedSynchronizer.ConditionObject.html" title="java.util.concurrent.locks 中的类"><B>上一个类</B></A>&nbsp;&nbsp;<A HREF="Lock.html" title="java.util.concurrent.locks 中的接口"><B>下一个类</B></A></FONT></TD><TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">  <A HREF="../../../../index.html@java_2Futil_2Fconcurrent_2Flocks_2FCondition.html" target="_top"><B>框架</B></A>  &nbsp;&nbsp;<A HREF="Condition.html" target="_top"><B>无框架</B></A>  &nbsp;&nbsp;<SCRIPT type="text/javascript">  <!--  if(window==top) {    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>所有类</B></A>');  }  //--></SCRIPT><NOSCRIPT>  <A HREF="../../../../allclasses-noframe.html"><B>所有类</B></A></NOSCRIPT></FONT></TD></TR><TR><TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">  摘要:&nbsp;嵌套&nbsp;|&nbsp;字段&nbsp;|&nbsp;构造方法&nbsp;|&nbsp;<A HREF="#method_summary">方法</A></FONT></TD><TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">详细信息:&nbsp;字段&nbsp;|&nbsp;构造方法&nbsp;|&nbsp;<A HREF="#method_detail">方法</A></FONT></TD></TR></TABLE><A NAME="skip-navbar_top"></A><!-- ========= END OF TOP NAVBAR ========= --><HR><!-- ======== START OF CLASS DATA ======== --><H2><FONT SIZE="-1">java.util.concurrent.locks</FONT><BR>接口 Condition</H2><DL><DT><B>所有已知实现类:</B> <DD><A HREF="AbstractQueuedSynchronizer.ConditionObject.html" title="java.util.concurrent.locks 中的类">AbstractQueuedSynchronizer.ConditionObject</A></DD></DL><HR><DL><DT><PRE>public interface <B>Condition</B></DL></PRE><P><tt>Condition</tt> 将 <tt>Object</tt> 监视器方法(<A HREF="../../../lang/Object.html#wait()"><CODE>wait</CODE></A>、<A HREF="../../../lang/Object.html#notify()"><CODE>notify</CODE></A> 和 <A HREF="../../../lang/Object.html#notifyAll()"><CODE>notifyAll</CODE></A>)分解成截然不同的对象,以便通过将这些对象与任意 <A HREF="Lock.html" title="java.util.concurrent.locks 中的接口"><CODE>Lock</CODE></A> 实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,<tt>Lock</tt> 替代了 <tt>synchronized</tt> 方法和语句的使用,<tt>Condition</tt> 替代了 Object 监视器方法的使用。<p>条件(也称为<em>条件队列</em> 或<em>条件变量</em>)为线程提供了一个含义,以便在某个状态条件现在可能为 true 的另一个线程通知它之前,一直挂起该线程(即让其&ldquo;等待&rdquo;)。因为访问此共享状态信息发生在不同的线程中,所以它必须受保护,因此要将某种形式的锁定与该条件相关联。等待提供一个条件的主要属性是:<em>以原子方式</em> 释放相关的锁定,并挂起当前线程,就像 <tt>Object.wait</tt> 做的那样。<p><tt>Condition</tt> 实例实质上被绑定到一个锁定上。要为特定 <A HREF="Lock.html" title="java.util.concurrent.locks 中的接口"><CODE>Lock</CODE></A> 实例获得 <tt>Condition</tt> 实例,请使用其 <A HREF="Lock.html#newCondition()"><CODE>newCondition()</CODE></A> 方法。<p>作为一个示例,假定有一个绑定的缓冲区,它支持 <tt>put</tt> 和 <tt>take</tt> 方法。如果试图在空的缓冲区上执行 <tt>take</tt> 操作,则在某一个项变得可用之前,线程将一直阻塞;如果试图在满的缓冲区上执行 <tt>put</tt> 操作,则在有空间变得可用之前,线程将一直阻塞。我们喜欢在单独的等待 set 中保存 <tt>put</tt> 线程和 <tt>take</tt> 线程,这样就可以在缓冲区中的项或空间变得可用时利用最佳规划,一次只通知一个线程。可以使用两个 <A HREF="Condition.html" title="java.util.concurrent.locks 中的接口"><CODE>Condition</CODE></A> 实例来做到这一点。 <pre> class BoundedBuffer {   <b>final Lock lock = new ReentrantLock();</b>   final Condition notFull  = <b>lock.newCondition(); </b>   final Condition notEmpty = <b>lock.newCondition(); </b>   final Object[] items = new Object[100];   int putptr, takeptr, count;   public void put(Object x) throws InterruptedException {     <b>lock.lock();     try {</b>       while (count == items.length)          <b>notFull.await();</b>       items[putptr] = x;        if (++putptr == items.length) putptr = 0;       ++count;       <b>notEmpty.signal();</b>     <b>} finally {       lock.unlock();     }</b>   }   public Object take() throws InterruptedException {     <b>lock.lock();     try {</b>       while (count == 0)          <b>notEmpty.await();</b>       Object x = items[takeptr];        if (++takeptr == items.length) takeptr = 0;       --count;       <b>notFull.signal();</b>       return x;     <b>} finally {       lock.unlock();     }</b>   }  } </pre>(<A HREF="../ArrayBlockingQueue.html" title="java.util.concurrent 中的类"><CODE>ArrayBlockingQueue</CODE></A> 类提供了这项功能,因此没有理由去实现这个示例类。)<p><tt>Condition</tt> 实现可以提供不同于 <tt>Object</tt> 监视器方法的行为和语义,比如受保证的通知排序,或者在执行通知时不需要保持一个锁定。如果某个实现提供了这样特殊的语义,则该实现必须记录这些语义。<p>注意,<tt>Condition</tt> 实例只是一些普通的对象,它们自身可以用作 <tt>synchronized</tt> 语句中的目标,并且可以调用自己的 <A HREF="../../../lang/Object.html#wait(long)"><CODE>wait</CODE></A> 和 <A HREF="../../../lang/Object.html#notify()"><CODE>notification</CODE></A> 监视器方法。获取 <tt>Condition</tt> 实例的监视器锁定或者使用其监视器方法,与获取和该 <tt>Condition</tt> 相关的 <A HREF="Lock.html" title="java.util.concurrent.locks 中的接口"><CODE>Lock</CODE></A> 或使用其 <A HREF="Condition.html#await()"><CODE>waiting</CODE></A> 和 <A HREF="Condition.html#signal()"><CODE>signalling</CODE></A> 方法没有什么特定的关系。为了避免混淆,建议除了在其自身的实现中之外,切勿以这种方式使用 <tt>Condition</tt> 实例。<p>除非另行说明,否则为任何参数传递 <tt>null</tt> 值将导致抛出 <A HREF="../../../lang/NullPointerException.html" title="java.lang 中的类"><CODE>NullPointerException</CODE></A>。<h3>实现注意事项</h3><p>在等待 <tt>Condition</tt> 时,允许发生&ldquo;<em>虚假唤醒</em>&rdquo;,这通常作为对基础平台语义的让步。对于大多数应用程序,这带来的实际影响很小,因为 <tt>Condition</tt> 应该总是在一个循环中被等待,并测试正被等待的状态声明。某个实现可以随意移除可能的虚假唤醒,但建议应用程序程序员总是假定这些虚假唤醒可能发生,因此总是在一个循环中等待。<p>三种形式的条件等待(可中断、不可中断和超时)在一些平台上的实现以及它们的性能特征可能会有所不同。尤其是它可能很难提供这些特性和维护特定语义,比如排序保证。更进一步地说,中断线程实际挂起的能力在所有平台上并不是总是可行的。<p>因此,并不要求某个实现为所有三种形式的等待定义完全相同的保证或语义,也不要求其支持中断线程的实际挂起。<p>要求实现清楚地记录每个等待方法提供的语义和保证,在某个实现不支持中断线程的挂起时,它必须遵从此接口中定义的中断语义。<p>由于中断通常意味着取消,而又通常很少进行中断检查,因此实现可以先于普通方法的返回来对中断进行响应。即使出现在另一个操作后的中断可能会释放线程锁定时也是如此。实现应记录此行为。<P><P><DL><DT><B>从以下版本开始:</B></DT>  <DD>1.5</DD></DL><HR><P><!-- ========== METHOD SUMMARY =========== --><A NAME="method_summary"><!-- --></A><TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""><TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"><TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2"><B>方法摘要</B></FONT></TH>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?