151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
246805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code).
1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions.
2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.nio.channels;
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.Closeable;
2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException;
3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.nio.channels.spi.SelectorProvider;
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Set;
3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/**
3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A multiplexor of {@link SelectableChannel} objects.
3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> A selector may be created by invoking the {@link #open open} method of
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this class, which will use the system's default {@link
3946805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * java.nio.channels.spi.SelectorProvider selector provider} to
4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * create a new selector.  A selector may also be created by invoking the
4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@link java.nio.channels.spi.SelectorProvider#openSelector openSelector}
4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method of a custom selector provider.  A selector remains open until it is
4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * closed via its {@link #close close} method.
4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
4546805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * <a name="ks"></a>
4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> A selectable channel's registration with a selector is represented by a
4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@link SelectionKey} object.  A selector maintains three sets of selection
4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * keys:
5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <ul>
5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   <li><p> The <i>key set</i> contains the keys representing the current
5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   channel registrations of this selector.  This set is returned by the
5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   {@link #keys() keys} method. </p></li>
5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   <li><p> The <i>selected-key set</i> is the set of keys such that each
5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   key's channel was detected to be ready for at least one of the operations
5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   identified in the key's interest set during a prior selection operation.
6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   This set is returned by the {@link #selectedKeys() selectedKeys} method.
6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   The selected-key set is always a subset of the key set. </p></li>
6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   <li><p> The <i>cancelled-key</i> set is the set of keys that have been
6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   cancelled but whose channels have not yet been deregistered.  This set is
6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   not directly accessible.  The cancelled-key set is always a subset of the
6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   key set. </p></li>
6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </ul>
6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> All three sets are empty in a newly-created selector.
7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> A key is added to a selector's key set as a side effect of registering a
7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * channel via the channel's {@link SelectableChannel#register(Selector,int)
7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * register} method.  Cancelled keys are removed from the key set during
7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * selection operations.  The key set itself is not directly modifiable.
7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> A key is added to its selector's cancelled-key set when it is cancelled,
7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * whether by closing its channel or by invoking its {@link SelectionKey#cancel
7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * cancel} method.  Cancelling a key will cause its channel to be deregistered
8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * during the next selection operation, at which time the key will removed from
8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * all of the selector's key sets.
8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
8346805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * <a name="sks"></a><p> Keys are added to the selected-key set by selection
8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * operations.  A key may be removed directly from the selected-key set by
8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * invoking the set's {@link java.util.Set#remove(java.lang.Object) remove}
8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method or by invoking the {@link java.util.Iterator#remove() remove} method
8746805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * of an {@link java.util.Iterator iterator} obtained from the
8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * set.  Keys are never removed from the selected-key set in any other way;
8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * they are not, in particular, removed as a side effect of selection
9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * operations.  Keys may not be added directly to the selected-key set. </p>
9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
9346805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * <a name="selop"></a>
9446805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * <h2>Selection</h2>
9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> During each selection operation, keys may be added to and removed from a
9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * selector's selected-key set and may be removed from its key and
9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * cancelled-key sets.  Selection is performed by the {@link #select()}, {@link
9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * #select(long)}, and {@link #selectNow()} methods, and involves three steps:
10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </p>
10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <ol>
10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   <li><p> Each key in the cancelled-key set is removed from each key set of
10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   which it is a member, and its channel is deregistered.  This step leaves
10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   the cancelled-key set empty. </p></li>
10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   <li><p> The underlying operating system is queried for an update as to the
10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   readiness of each remaining channel to perform any of the operations
11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   identified by its key's interest set as of the moment that the selection
11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   operation began.  For a channel that is ready for at least one such
11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   operation, one of the following two actions is performed: </p>
11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
11446805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera *   <ol>
11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     <li><p> If the channel's key is not already in the selected-key set then
11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     it is added to that set and its ready-operation set is modified to
11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     identify exactly those operations for which the channel is now reported
11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     to be ready.  Any readiness information previously recorded in the ready
12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     set is discarded.  </p></li>
12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     <li><p> Otherwise the channel's key is already in the selected-key set,
12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     so its ready-operation set is modified to identify any new operations
12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     for which the channel is reported to be ready.  Any readiness
12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     information previously recorded in the ready set is preserved; in other
12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     words, the ready set returned by the underlying system is
12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *     bitwise-disjoined into the key's current ready set. </p></li>
12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
12946805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera *   </ol>
13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   If all of the keys in the key set at the start of this step have empty
13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   interest sets then neither the selected-key set nor any of the keys'
13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   ready-operation sets will be updated.
13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   <li><p> If any keys were added to the cancelled-key set while step (2) was
13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   in progress then they are processed as in step (1). </p></li>
13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </ol>
13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Whether or not a selection operation blocks to wait for one or more
14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * channels to become ready, and if so for how long, is the only essential
14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * difference between the three selection methods. </p>
14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
14546805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * <h2>Concurrency</h2>
14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Selectors are themselves safe for use by multiple concurrent threads;
14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * their key sets, however, are not.
14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> The selection operations synchronize on the selector itself, on the key
15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * set, and on the selected-key set, in that order.  They also synchronize on
15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the cancelled-key set during steps (1) and (3) above.
15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Changes made to the interest sets of a selector's keys while a
15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * selection operation is in progress have no effect upon that operation; they
15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * will be seen by the next selection operation.
15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Keys may be cancelled and channels may be closed at any time.  Hence the
15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * presence of a key in one or more of a selector's key sets does not imply
16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * that the key is valid or that its channel is open.  Application code should
16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * be careful to synchronize and check these conditions as necessary if there
16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is any possibility that another thread will cancel a key or close a channel.
16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> A thread blocked in one of the {@link #select()} or {@link
16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * #select(long)} methods may be interrupted by some other thread in one of
16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * three ways:
16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <ul>
16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   <li><p> By invoking the selector's {@link #wakeup wakeup} method,
17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   </p></li>
17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   <li><p> By invoking the selector's {@link #close close} method, or
17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   </p></li>
17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   <li><p> By invoking the blocked thread's {@link
17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   java.lang.Thread#interrupt() interrupt} method, in which case its
17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   interrupt status will be set and the selector's {@link #wakeup wakeup}
17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *   method will be invoked. </p></li>
18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </ul>
18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> The {@link #close close} method synchronizes on the selector and all
18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * three key sets in the same order as in a selection operation.
18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
18646805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * <a name="ksc"></a>
18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> A selector's key and selected-key sets are not, in general, safe for use
18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by multiple concurrent threads.  If such a thread might modify one of these
19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * sets directly then access should be controlled by synchronizing on the set
19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * itself.  The iterators returned by these sets' {@link
19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * java.util.Set#iterator() iterator} methods are <i>fail-fast:</i> If the set
19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is modified after the iterator is created, in any way except by invoking the
19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * iterator's own {@link java.util.Iterator#remove() remove} method, then a
19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@link java.util.ConcurrentModificationException} will be thrown. </p>
19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Mark Reinhold
19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author JSR-51 Expert Group
20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4
20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see SelectableChannel
20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see SelectionKey
20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic abstract class Selector implements Closeable {
20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Initializes a new instance of this class.
21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected Selector() { }
21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Opens a selector.
21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> The new selector is created by invoking the {@link
21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * java.nio.channels.spi.SelectorProvider#openSelector openSelector} method
21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * of the system-wide default {@link
21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * java.nio.channels.spi.SelectorProvider} object.  </p>
22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  A new selector
22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  IOException
22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If an I/O error occurs
22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static Selector open() throws IOException {
22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return SelectorProvider.provider().openSelector();
22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
23146805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera     * Tells whether or not this selector is open.
23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return <tt>true</tt> if, and only if, this selector is open
23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public abstract boolean isOpen();
23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
23846805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera     * Returns the provider that created this channel.
23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  The provider that created this channel
24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public abstract SelectorProvider provider();
24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns this selector's key set.
24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> The key set is not directly modifiable.  A key is removed only after
24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * it has been cancelled and its channel has been deregistered.  Any
24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * attempt to modify the key set will cause an {@link
25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * UnsupportedOperationException} to be thrown.
25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> The key set is <a href="#ksc">not thread-safe</a>. </p>
25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  This selector's key set
25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  ClosedSelectorException
25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If this selector is closed
25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public abstract Set<SelectionKey> keys();
26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns this selector's selected-key set.
26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> Keys may be removed from, but not directly added to, the
26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * selected-key set.  Any attempt to add an object to the key set will
26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * cause an {@link UnsupportedOperationException} to be thrown.
26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> The selected-key set is <a href="#ksc">not thread-safe</a>. </p>
26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  This selector's selected-key set
27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  ClosedSelectorException
27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If this selector is closed
27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public abstract Set<SelectionKey> selectedKeys();
27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Selects a set of keys whose corresponding channels are ready for I/O
27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * operations.
28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> This method performs a non-blocking <a href="#selop">selection
28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * operation</a>.  If no channels have become selectable since the previous
28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * selection operation then this method immediately returns zero.
28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> Invoking this method clears the effect of any previous invocations
28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * of the {@link #wakeup wakeup} method.  </p>
28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  The number of keys, possibly zero, whose ready-operation sets
28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          were updated by the selection operation
29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  IOException
29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If an I/O error occurs
29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  ClosedSelectorException
29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If this selector is closed
29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public abstract int selectNow() throws IOException;
29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Selects a set of keys whose corresponding channels are ready for I/O
30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * operations.
30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> This method performs a blocking <a href="#selop">selection
30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * operation</a>.  It returns only after at least one channel is selected,
30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * this selector's {@link #wakeup wakeup} method is invoked, the current
30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * thread is interrupted, or the given timeout period expires, whichever
30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * comes first.
30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> This method does not offer real-time guarantees: It schedules the
31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * timeout as if by invoking the {@link Object#wait(long)} method. </p>
31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  timeout  If positive, block for up to <tt>timeout</tt>
31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                  milliseconds, more or less, while waiting for a
31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                  channel to become ready; if zero, block indefinitely;
31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *                  must not be negative
31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  The number of keys, possibly zero,
31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          whose ready-operation sets were updated
31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  IOException
32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If an I/O error occurs
32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  ClosedSelectorException
32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If this selector is closed
32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  IllegalArgumentException
32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If the value of the timeout argument is negative
32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public abstract int select(long timeout)
33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throws IOException;
33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Selects a set of keys whose corresponding channels are ready for I/O
33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * operations.
33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> This method performs a blocking <a href="#selop">selection
33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * operation</a>.  It returns only after at least one channel is selected,
33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * this selector's {@link #wakeup wakeup} method is invoked, or the current
33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * thread is interrupted, whichever comes first.  </p>
34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  The number of keys, possibly zero,
34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          whose ready-operation sets were updated
34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  IOException
34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If an I/O error occurs
34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  ClosedSelectorException
34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If this selector is closed
34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public abstract int select() throws IOException;
35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Causes the first selection operation that has not yet returned to return
35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * immediately.
35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> If another thread is currently blocked in an invocation of the
35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@link #select()} or {@link #select(long)} methods then that invocation
35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * will return immediately.  If no selection operation is currently in
35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * progress then the next invocation of one of these methods will return
36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * immediately unless the {@link #selectNow()} method is invoked in the
36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * meantime.  In any case the value returned by that invocation may be
36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * non-zero.  Subsequent invocations of the {@link #select()} or {@link
36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * #select(long)} methods will block as usual unless this method is invoked
36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * again in the meantime.
36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> Invoking this method more than once between two successive selection
36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * operations has the same effect as invoking it just once.  </p>
36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  This selector
37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public abstract Selector wakeup();
37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Closes this selector.
37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> If a thread is currently blocked in one of this selector's selection
37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * methods then it is interrupted as if by invoking the selector's {@link
37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * #wakeup wakeup} method.
37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> Any uncancelled keys still associated with this selector are
38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * invalidated, their channels are deregistered, and any other resources
38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * associated with this selector are released.
38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> If this selector is already closed then invoking this method has no
38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * effect.
38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> After a selector is closed, any further attempt to use it, except by
38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * invoking this method or the {@link #wakeup wakeup} method, will cause a
38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@link ClosedSelectorException} to be thrown. </p>
39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws  IOException
39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          If an I/O error occurs
39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public abstract void close() throws IOException;
39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
397