< prev index next >

src/java.base/share/classes/java/nio/channels/spi/AbstractInterruptibleChannel.java

Print this page




  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 /*
  27  */
  28 
  29 package java.nio.channels.spi;
  30 
  31 import java.io.IOException;
  32 import java.nio.channels.*;
  33 import jdk.internal.misc.SharedSecrets;
  34 import sun.nio.ch.Interruptible;
  35 
  36 
  37 /**
  38  * Base implementation class for interruptible channels.
  39  *
  40  * <p> This class encapsulates the low-level machinery required to implement
  41  * the asynchronous closing and interruption of channels.  A concrete channel
  42  * class must invoke the {@link #begin begin} and {@link #end end} methods
  43  * before and after, respectively, invoking an I/O operation that might block
  44  * indefinitely.  In order to ensure that the {@link #end end} method is always
  45  * invoked, these methods should be used within a
  46  * {@code try}&nbsp;...&nbsp;{@code finally} block:
  47  *
  48  * <blockquote><pre id="be">
  49  * boolean completed = false;
  50  * try {
  51  *     begin();
  52  *     completed = ...;    // Perform blocking I/O operation
  53  *     return ...;         // Return result


 186      * @throws  AsynchronousCloseException
 187      *          If the channel was asynchronously closed
 188      *
 189      * @throws  ClosedByInterruptException
 190      *          If the thread blocked in the I/O operation was interrupted
 191      */
 192     protected final void end(boolean completed)
 193         throws AsynchronousCloseException
 194     {
 195         blockedOn(null);
 196         Thread interrupted = this.interrupted;
 197         if (interrupted != null && interrupted == Thread.currentThread()) {
 198             this.interrupted = null;
 199             throw new ClosedByInterruptException();
 200         }
 201         if (!completed && closed)
 202             throw new AsynchronousCloseException();
 203     }
 204 
 205 
 206     // -- jdk.internal.misc.SharedSecrets --
 207     static void blockedOn(Interruptible intr) {         // package-private
 208         SharedSecrets.getJavaLangAccess().blockedOn(intr);
 209     }
 210 }


  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 /*
  27  */
  28 
  29 package java.nio.channels.spi;
  30 
  31 import java.io.IOException;
  32 import java.nio.channels.*;
  33 import jdk.internal.access.SharedSecrets;
  34 import sun.nio.ch.Interruptible;
  35 
  36 
  37 /**
  38  * Base implementation class for interruptible channels.
  39  *
  40  * <p> This class encapsulates the low-level machinery required to implement
  41  * the asynchronous closing and interruption of channels.  A concrete channel
  42  * class must invoke the {@link #begin begin} and {@link #end end} methods
  43  * before and after, respectively, invoking an I/O operation that might block
  44  * indefinitely.  In order to ensure that the {@link #end end} method is always
  45  * invoked, these methods should be used within a
  46  * {@code try}&nbsp;...&nbsp;{@code finally} block:
  47  *
  48  * <blockquote><pre id="be">
  49  * boolean completed = false;
  50  * try {
  51  *     begin();
  52  *     completed = ...;    // Perform blocking I/O operation
  53  *     return ...;         // Return result


 186      * @throws  AsynchronousCloseException
 187      *          If the channel was asynchronously closed
 188      *
 189      * @throws  ClosedByInterruptException
 190      *          If the thread blocked in the I/O operation was interrupted
 191      */
 192     protected final void end(boolean completed)
 193         throws AsynchronousCloseException
 194     {
 195         blockedOn(null);
 196         Thread interrupted = this.interrupted;
 197         if (interrupted != null && interrupted == Thread.currentThread()) {
 198             this.interrupted = null;
 199             throw new ClosedByInterruptException();
 200         }
 201         if (!completed && closed)
 202             throw new AsynchronousCloseException();
 203     }
 204 
 205 
 206     // -- jdk.internal.access.SharedSecrets --
 207     static void blockedOn(Interruptible intr) {         // package-private
 208         SharedSecrets.getJavaLangAccess().blockedOn(intr);
 209     }
 210 }
< prev index next >