semaphore.html

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

HTML
883
字号
<TD><CODE><B><A HREF="Semaphore.html#release()">release</A></B>()</CODE><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;释放一个许可,将其返回给信号量。</TD></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"><CODE>&nbsp;void</CODE></FONT></TD><TD><CODE><B><A HREF="Semaphore.html#release(int)">release</A></B>(int&nbsp;permits)</CODE><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;释放给定数目的许可,将其返回到信号量。</TD></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"><CODE>&nbsp;<A HREF="../../lang/String.html" title="java.lang 中的类">String</A></CODE></FONT></TD><TD><CODE><B><A HREF="Semaphore.html#toString()">toString</A></B>()</CODE><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回标识此信号量的字符串,以及信号量的状态。</TD></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"><CODE>&nbsp;boolean</CODE></FONT></TD><TD><CODE><B><A HREF="Semaphore.html#tryAcquire()">tryAcquire</A></B>()</CODE><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;仅在调用时此信号量存在一个可用许可,才从信号量获取许可。</TD></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"><CODE>&nbsp;boolean</CODE></FONT></TD><TD><CODE><B><A HREF="Semaphore.html#tryAcquire(int)">tryAcquire</A></B>(int&nbsp;permits)</CODE><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;仅在调用时此信号量中有给定数目的许可时,才从此信号量中获取这些许可。</TD></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"><CODE>&nbsp;boolean</CODE></FONT></TD><TD><CODE><B><A HREF="Semaphore.html#tryAcquire(int, long, java.util.concurrent.TimeUnit)">tryAcquire</A></B>(int&nbsp;permits,           long&nbsp;timeout,           <A HREF="TimeUnit.html" title="java.util.concurrent 中的枚举">TimeUnit</A>&nbsp;unit)</CODE><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果在给定的等待时间内此信号量有可用的所有许可,并且当前线程未被<A HREF="../../lang/Thread.html#interrupt()"><CODE>中断</CODE></A>,则从此信号量获取给定数目的许可。</TD></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"><CODE>&nbsp;boolean</CODE></FONT></TD><TD><CODE><B><A HREF="Semaphore.html#tryAcquire(long, java.util.concurrent.TimeUnit)">tryAcquire</A></B>(long&nbsp;timeout,           <A HREF="TimeUnit.html" title="java.util.concurrent 中的枚举">TimeUnit</A>&nbsp;unit)</CODE><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果在给定的等待时间内,此信号量有可用的许可并且当前线程未被<A HREF="../../lang/Thread.html#interrupt()"><CODE>中断</CODE></A>,则从此信号量获取一个许可。</TD></TR></TABLE>&nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A><TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""><TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor"><TH ALIGN="left"><B>从类 java.lang.<A HREF="../../lang/Object.html" title="java.lang 中的类">Object</A> 继承的方法</B></TH></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD><CODE><A HREF="../../lang/Object.html#clone()">clone</A>, <A HREF="../../lang/Object.html#equals(java.lang.Object)">equals</A>, <A HREF="../../lang/Object.html#finalize()">finalize</A>, <A HREF="../../lang/Object.html#getClass()">getClass</A>, <A HREF="../../lang/Object.html#hashCode()">hashCode</A>, <A HREF="../../lang/Object.html#notify()">notify</A>, <A HREF="../../lang/Object.html#notifyAll()">notifyAll</A>, <A HREF="../../lang/Object.html#wait()">wait</A>, <A HREF="../../lang/Object.html#wait(long)">wait</A>, <A HREF="../../lang/Object.html#wait(long, int)">wait</A></CODE></TD></TR></TABLE>&nbsp;<P><!-- ========= CONSTRUCTOR DETAIL ======== --><A NAME="constructor_detail"><!-- --></A><TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""><TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"><TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2"><B>构造方法详细信息</B></FONT></TH></TR></TABLE><A NAME="Semaphore(int)"><!-- --></A><H3>Semaphore</H3><PRE>public <B>Semaphore</B>(int&nbsp;permits)</PRE><DL><DD>用给定的许可数和非公平的公平设置创建一个 <tt>Semaphore</tt>。<P><DL><DT><B>参数:</B><DD><CODE>permits</CODE> - 初始的可用许可数目。此值可能为负数,在这种情况下,必须在授予任何获取前进行释放。</DL></DL><HR><A NAME="Semaphore(int, boolean)"><!-- --></A><H3>Semaphore</H3><PRE>public <B>Semaphore</B>(int&nbsp;permits,                 boolean&nbsp;fair)</PRE><DL><DD>用给定的许可数和给定的公平设置创建一个 <tt>Semaphore</tt>。<P><DL><DT><B>参数:</B><DD><CODE>permits</CODE> - 初始的可用许可数目。此值可能为负数,在这种情况下,必须在授予任何获取前进行释放。<DD><CODE>fair</CODE> - 如果此信号量保证在争用时按先进先出的顺序授予许可,则为 ture,否则为 false。</DL></DL><!-- ============ METHOD DETAIL ========== --><A NAME="method_detail"><!-- --></A><TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""><TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"><TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2"><B>方法详细信息</B></FONT></TH></TR></TABLE><A NAME="acquire()"><!-- --></A><H3>acquire</H3><PRE>public void <B>acquire</B>()             throws <A HREF="../../lang/InterruptedException.html" title="java.lang 中的类">InterruptedException</A></PRE><DL><DD>从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被<A HREF="../../lang/Thread.html#interrupt()"><CODE>中断</CODE></A>。<p>获取一个许可(如果提供了一个)并立即返回,将可用的许可数减 1。<p>如果没有可用的许可,则在发生以下两种情况之一前,禁止将当前线程用于线程安排目的并使其处于休眠状态: <ul><li>某些其他线程调用此信号量的 <A HREF="Semaphore.html#release()"><CODE>release()</CODE></A> 方法,并且当前线程是下一个要被分配许可的线程;或者<li>其他某些线程<A HREF="../../lang/Thread.html#interrupt()"><CODE>中断</CODE></A>当前线程。 </ul><p>如果当前线程: <ul><li>被此方法将其已中断状态设置为 on ;或者<li>在等待许可时被<A HREF="../../lang/Thread.html#interrupt()"><CODE>中断</CODE></A>。 </ul>则抛出 <A HREF="../../lang/InterruptedException.html" title="java.lang 中的类"><CODE>InterruptedException</CODE></A>,并且清除当前线程的已中断状态。<P><DD><DL></DL></DD><DD><DL><DT><B>抛出:</B><DD><CODE><A HREF="../../lang/InterruptedException.html" title="java.lang 中的类">InterruptedException</A></CODE> - 如果当前线程是已中断的。<DT><B>另请参见:</B><DD><A HREF="../../lang/Thread.html#interrupt()"><CODE>Thread.interrupt()</CODE></A></DL></DD></DL><HR><A NAME="acquireUninterruptibly()"><!-- --></A><H3>acquireUninterruptibly</H3><PRE>public void <B>acquireUninterruptibly</B>()</PRE><DL><DD>从此信号量中获取许可,在有可用的许可前将其阻塞。<p>获取一个许可(如果提供了一个)并立即返回,将可用的允许数减 1。<p>如果没有可用的许可,则在其他某些线程调用此信号量的 <A HREF="Semaphore.html#release()"><CODE>release()</CODE></A> 方法,并且当前线程是下一个要被分配许可的线程前,禁止当前线程用于线程安排目的并使其处于休眠状态。<p>如果当前线程在等待许可时是<A HREF="../../lang/Thread.html#interrupt()"><CODE>已中断的</CODE></A>,那么它将继续等待,但是与没有发生中断,其将接收允许的时间相比,为该线程分配许可的时间可能改变。当线程确实从此方法返回后,将设置其中断状态。<P><DD><DL></DL></DD><DD><DL></DL></DD></DL><HR><A NAME="tryAcquire()"><!-- --></A><H3>tryAcquire</H3><PRE>public boolean <B>tryAcquire</B>()</PRE><DL><DD>仅在调用时此信号量存在一个可用许可,才从信号量获取许可。<p>获取一个许可(如果提供了一个)并立即返回,其值为 <tt>true</tt>,将可用的许可数减 1。<p>如果没有可用的许可,则此方法立即返回并且值为 <tt>false</tt>.<p>即使已将此信号量设置为使用公平排序策略,但是调用 <tt>tryAcquire()</tt> 也<em>将</em> 立即获取许可(如果有一个可用),而不管当前是否有正在等待的线程。在某些情况下,此&ldquo;闯入&rdquo;行为可能很有用,即使它会打破公平性也如此。如果希望遵守公平设置,则使用 <A HREF="Semaphore.html#tryAcquire(long, java.util.concurrent.TimeUnit)"><CODE>tryAcquire(0, TimeUnit.SECONDS) </CODE></A>,它几乎是等效的(它也检测中断)。<P><DD><DL></DL></DD><DD><DL><DT><B>返回:</B><DD>如果获取了许可,则返回 <tt>true</tt>;否则返回 <tt>false</tt>。</DL></DD></DL><HR><A NAME="tryAcquire(long, java.util.concurrent.TimeUnit)"><!-- --></A><H3>tryAcquire</H3><PRE>public boolean <B>tryAcquire</B>(long&nbsp;timeout,                          <A HREF="TimeUnit.html" title="java.util.concurrent 中的枚举">TimeUnit</A>&nbsp;unit)                   throws <A HREF="../../lang/InterruptedException.html" title="java.lang 中的类">InterruptedException</A></PRE><DL><DD>如果在给定的等待时间内,此信号量有可用的许可并且当前线程未被<A HREF="../../lang/Thread.html#interrupt()"><CODE>中断</CODE></A>,则从此信号量获取一个许可。<p>获取一个许可(如果提供了一个)并立即返回,其值为 <tt>true</tt>,将可用的许可数减 1。<p>如果没有可用的允许,则在发生以下三种情况之一前,禁止将当前线程用于线程安排目的并使其处于休眠状态: <ul><li>其他某些线程调用此信号量的 <A HREF="Semaphore.html#release()"><CODE>release()</CODE></A> 方法并且当前线程是下一个被分配许可的线程;或者<li>其他某些线程<A HREF="../../lang/Thread.html#interrupt()"><CODE>中断</CODE></A>当前线程;或者<li>已超出指定的等待时间。 </ul><p>如果获取了许可,则返回值为 <tt>true</tt>。<p>如果当前线程: <ul><li>被此方法将其已中断状态设置为 on ;或者<li>在等待获取许可的同时被<A HREF="../../lang/Thread.html#interrupt()"><CODE>中断</CODE></A>。 </ul>则抛出 <A HREF="../../lang/InterruptedException.html" title="java.lang 中的类"><CODE>InterruptedException</CODE></A>,并且清除当前线程的已中断状态。<p>如果超出了指定的等待时间,则返回值为 <tt>false</tt>。如果该时间小于或等于 0,则方法根本不等待。<P><DD><DL></DL></DD><DD><DL><DT><B>参数:</B><DD><CODE>timeout</CODE> - 等待许可的最多时间。<DD><CODE>unit</CODE> - <tt>timeout</tt> 参数的时间单位。<DT><B>返回:</B><DD>如果获取了许可,则返回 <tt>true</tt>;如果获取许可前超出了等待时间,则返回 <tt>false</tt>。<DT><B>抛出:</B><DD><CODE><A HREF="../../lang/InterruptedException.html" title="java.lang 中的类">InterruptedException</A></CODE> - 如果当前线程是已中断的。<DT><B>另请参见:</B><DD><A HREF="../../lang/Thread.html#interrupt()"><CODE>Thread.interrupt()</CODE></A></DL></DD></DL><HR><A NAME="release()"><!-- --></A><H3>release</H3><PRE>public void <B>release</B>()</PRE><DL><DD>释放一个许可,将其返回给信号量。<p>释放一个许可,将可用的许可数增加 1。如果任意线程试图获取许可,则选中一个线程并将刚刚释放的许可给予它。然后针对线程安排目的启用(或再启用)该线程。<p>不要求释放许可的线程必须通过调用 <A HREF="Semaphore.html#acquire()"><CODE>acquire()</CODE></A> 来获取许可。通过应用程序中的编程约定来建立信号量的正确用法。<P><DD><DL></DL></DD><DD><DL></DL></DD></DL><HR><A NAME="acquire(int)"><!-- --></A><H3>acquire</H3><PRE>public void <B>acquire</B>(int&nbsp;permits)             throws <A HREF="../../lang/InterruptedException.html" title="java.lang 中的类">InterruptedException</A></PRE><DL><DD>从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞,否则线程是<A HREF="../../lang/Thread.html#interrupt()"><CODE>已中断的</CODE></A>。<p>获取给定数目的许可(如果提供了)并立即返回,将可用的许可数减去给定的量。<p>如果没有足够的可用许可,则在发生以下两种情况之一前,禁止将当前线程用于线程安排目的并使其处于休眠状态: <ul><li>其他某些线程调用此信号量的某个<A HREF="Semaphore.html#release()"><CODE>释放</CODE></A>方法,当前线程是下一个被分配允许的线程并且可用许可的数目满足此请求;或者<li>其他某些线程<A HREF="../../lang/Thread.html#interrupt()"><CODE>中断</CODE></A>当前线程。 </ul><p>如果当前线程: <ul><li>被此方法将其已中断状态设置为 on ;或者<li>在等待许可时被<A HREF="../../lang/Thread.html#interrupt()"><CODE>中断</CODE></A>。 </ul>则抛出 <A HREF="../../lang/InterruptedException.html" title="java.lang 中的类"><CODE>InterruptedException</CODE></A>,并且清除当前线程的已中断状态。任何原本应该分配给此线程的许可将被分配给其他试图获取许可的线程,就好像已通过调用 <A HREF="Semaphore.html#release()"><CODE>release()</CODE></A> 而使许可可用一样。<P><DD><DL></DL></DD><DD><DL><DT><B>参数:</B><DD><CODE>permits</CODE> - 要获取的许可数。<DT><B>抛出:</B><DD><CODE><A HREF="../../lang/InterruptedException.html" title="java.lang 中的类">InterruptedException</A></CODE> - 如果当前线程是已中断的。<DD><CODE><A HREF="../../lang/IllegalArgumentException.html" title="java.lang 中的类">IllegalArgumentException</A></CODE> - 如果许可小于 0。<DT><B>另请参见:</B><DD><A HREF="../../lang/Thread.html#interrupt()"><CODE>Thread.interrupt()</CODE></A></DL></DD></DL><HR><A NAME="acquireUninterruptibly(int)"><!-- --></A><H3>acquireUninterruptibly</H3><PRE>public void <B>acquireUninterruptibly</B>(int&nbsp;permits)</PRE><DL><DD>从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞。<p>获取给定数目的许可(如果提供了)并立即返回,将可用的许可数减去给定的量。<p>如果没有足够的可用许可,则在其他某些线程调用此信号量的某个<A HREF="Semaphore.html#release()"><CODE>释放</CODE></A>方法,当前线程是下一个要被分配许可的线程,并且可用的许可数目满足此请求前,禁止当前线程用于线程安排目的并使其处于休眠状态。<p>如果当前的线程在等待许可时成为<A HREF="../../lang/Thread.html#interrupt()"><CODE>已中断的</CODE></A>,则它会继续等待并且它在队列中的位置不受影响。当线程确实从此方法返回后,将其设置为中断状态。<P><DD><DL></DL></DD><DD><DL>

⌨️ 快捷键说明

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