/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package java.nio.channels; import java.io.IOException; import java.nio.channels.spi.AbstractInterruptibleChannel; import java.nio.channels.spi.SelectorProvider; /** * A channel that can be used with a {@link Selector}. The channel must be * registered with a selector by calling one of the {@code register} methods, * which return a {@link SelectionKey} object. In order to deregister a channel * from a selector, its selection key must be canceled. This can be done * explicitly by calling the {@link SelectionKey#cancel()} method but it is also * done implicitly when the channel or the selector is closed. * <p> * A channel may be registered with several selectors at the same time but only * once for any given selector. */ public abstract class SelectableChannel extends AbstractInterruptibleChannel implements Channel { /** * Constructs a new {@code SelectableChannel}. */ protected SelectableChannel() { } /** * Gets the blocking lock which synchronizes the {@code configureBlocking} * and {@code register} methods. * * @return the blocking object as lock. */ public abstract Object blockingLock(); /** * Sets the blocking mode of this channel. A call to this method blocks if * other calls to this method or to a {@code register} method are executing. * The new blocking mode is valid for calls to other methods that are * invoked after the call to this method. If other methods are already * executing when this method is called, they still have the old mode and * the call to this method might block depending on the implementation. * * @param block * {@code true} for setting this channel's mode to blocking, * {@code false} to set it to non-blocking. * @return this channel. * @throws ClosedChannelException * if this channel is closed. * @throws IllegalBlockingModeException * if {@code block} is {@code true} and this channel has been * registered with at least one selector. * @throws IOException * if an I/O error occurs. */ public abstract SelectableChannel configureBlocking(boolean block) throws IOException; /** * Indicates whether this channel is in blocking mode. * * @return {@code true} if this channel is blocking, undefined if this * channel is closed. */ public abstract boolean isBlocking(); /** * Indicates whether this channel is registered with at least one selector. * * @return {@code true} if this channel is registered, {@code false} * otherwise. */ public abstract boolean isRegistered(); /** * Gets this channel's selection key for the specified selector. * * @param sel * the selector with which this channel has been registered. * @return the selection key for the channel or {@code null} if this channel * has not been registered with {@code sel}. */ public abstract SelectionKey keyFor(Selector sel); /** * Gets the provider of this channel. * * @return the provider of this channel. */ public abstract SelectorProvider provider(); /** * Registers this channel with the specified selector for the specified * interest set. If the channel is already registered with the selector, the * corresponding selection key is returned but the * {@link SelectionKey interest set} is updated to {@code operations}. The * returned key is canceled if the channel is closed while registering is in * progress. * <p> * Calling this method is valid at any time. If another thread executes this * method or the {@code configureBlocking(boolean} method then this call is * blocked until the other call finishes. After that, it will synchronize on * the key set of the selector and thus may again block if other threads * also hold locks on the key set of the same selector. * <p> * Calling this method is equivalent to calling * {@code register(selector, operations, null)}. * * @param selector * the selector with which to register this channel. * @param operations * this channel's {@link SelectionKey interest set}. * @return the selection key for this registration. * @throws ClosedChannelException * if the channel is closed. * @throws IllegalBlockingModeException * if the channel is in blocking mode. * @throws IllegalSelectorException * if this channel does not have the same provider as the given * selector. * @throws CancelledKeyException * if this channel is registered but its key has been canceled. * @throws IllegalArgumentException * if the operation given is not supported by this channel. */ public final SelectionKey register(Selector selector, int operations) throws ClosedChannelException { return register(selector, operations, null); } /** * Registers this channel with the specified selector for the specified * interest set and an object to attach. If the channel is already * registered with the selector, the corresponding selection key is returned * but its {@link SelectionKey interest set} is updated to {@code ops} and * the attached object is updated to {@code att}. The returned key is * canceled if the channel is closed while registering is in progress. * <p> * Calling this method is valid at any time. If another thread executes this * method or the {@code configureBlocking(boolean)} method then this call is * blocked until the other call finishes. After that, it will synchronize on * the key set of the selector and thus may again block if other threads * also hold locks on the key set of the same selector. * * @param sel * the selector with which to register this channel. * @param ops * this channel's {@link SelectionKey interest set}. * @param att * the object to attach, can be {@code null}. * @return the selection key for this registration. * @throws ClosedChannelException * if this channel is closed. * @throws IllegalArgumentException * if {@code ops} is not supported by this channel. * @throws IllegalBlockingModeException * if this channel is in blocking mode. * @throws IllegalSelectorException * if this channel does not have the same provider as the given * selector. * @throws CancelledKeyException * if this channel is registered but its key has been canceled. */ public abstract SelectionKey register(Selector sel, int ops, Object att) throws ClosedChannelException; /** * Gets the set of valid {@link SelectionKey operations} of this channel. * Instances of a concrete channel class always return the same value. * * @return the set of operations that this channel supports. */ public abstract int validOps(); }