History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/java/awt/SecondaryLoop.java (1 of 18352 files). Show all

Unified · Split

java/pkg/java/awt/SecondaryLoop.java+147−0
@@ -0,0 +1,147 @@
1/*
2 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
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
26package java.awt;
27
28/**
29 * A helper interface to run the nested event loop.
30 * <p>
31 * Objects that implement this interface are created with the
32 * {@link EventQueue#createSecondaryLoop} method. The interface
33 * provides two methods, {@link #enter} and {@link #exit},
34 * which can be used to start and stop the event loop.
35 * <p>
36 * When the {@link #enter} method is called, the current
37 * thread is blocked until the loop is terminated by the
38 * {@link #exit} method. Also, a new event loop is started
39 * on the event dispatch thread, which may or may not be
40 * the current thread. The loop can be terminated on any
41 * thread by calling its {@link #exit} method. After the
42 * loop is terminated, the {@code SecondaryLoop} object can
43 * be reused to run a new nested event loop.
44 * <p>
45 * A typical use case of applying this interface is AWT
46 * and Swing modal dialogs. When a modal dialog is shown on
47 * the event dispatch thread, it enters a new secondary loop.
48 * Later, when the dialog is hidden or disposed, it exits
49 * the loop, and the thread continues its execution.
50 * <p>
51 * The following example illustrates a simple use case of
52 * secondary loops:
53 *
54 * <pre>
55 * SecondaryLoop loop;
56 *
57 * JButton jButton = new JButton("Button");
58 * jButton.addActionListener(new ActionListener() {
59 * {@code @Override}
60 * public void actionPerformed(ActionEvent e) {
61 * Toolkit tk = Toolkit.getDefaultToolkit();
62 * EventQueue eq = tk.getSystemEventQueue();
63 * loop = eq.createSecondaryLoop();
64 *
65 * // Spawn a new thread to do the work
66 * Thread worker = new WorkerThread();
67 * worker.start();
68 *
69 * // Enter the loop to block the current event
70 * // handler, but leave UI responsive
71 * if (!loop.enter()) {
72 * // Report an error
73 * }
74 * }
75 * });
76 *
77 * class WorkerThread extends Thread {
78 * {@code @Override}
79 * public void run() {
80 * // Perform calculations
81 * doSomethingUseful();
82 *
83 * // Exit the loop
84 * loop.exit();
85 * }
86 * }
87 * </pre>
88 *
89 * @see Dialog#show
90 * @see EventQueue#createSecondaryLoop
91 * @see Toolkit#getSystemEventQueue
92 *
93 * @author Anton Tarasov, Artem Ananiev
94 *
95 * @since 1.7
96 */
97public interface SecondaryLoop {
98
99 /**
100 * Blocks the execution of the current thread and enters a new
101 * secondary event loop on the event dispatch thread.
102 * <p>
103 * This method can be called by any thread including the event
104 * dispatch thread. This thread will be blocked until the {@link
105 * #exit} method is called or the loop is terminated. A new
106 * secondary loop will be created on the event dispatch thread
107 * for dispatching events in either case.
108 * <p>
109 * This method can only start one new event loop at a time per
110 * object. If a secondary event loop has already been started
111 * by this object and is currently still running, this method
112 * returns {@code false} to indicate that it was not successful
113 * in starting a new event loop. Otherwise, this method blocks
114 * the calling thread and later returns {@code true} when the
115 * new event loop is terminated. At such time, this object can
116 * again be used to start another new event loop.
117 *
118 * @return {@code true} after termination of the secondary loop,
119 * if the secondary loop was started by this call,
120 * {@code false} otherwise
121 */
122 public boolean enter();
123
124 /**
125 * Unblocks the execution of the thread blocked by the {@link
126 * #enter} method and exits the secondary loop.
127 * <p>
128 * This method resumes the thread that called the {@link #enter}
129 * method and exits the secondary loop that was created when
130 * the {@link #enter} method was invoked.
131 * <p>
132 * Note that if any other secondary loop is started while this
133 * loop is running, the blocked thread will not resume execution
134 * until the nested loop is terminated.
135 * <p>
136 * If this secondary loop has not been started with the {@link
137 * #enter} method, or this secondary loop has already finished
138 * with the {@link #exit} method, this method returns {@code
139 * false}, otherwise {@code true} is returned.
140 *
141 * @return {@code true} if this loop was previously started and
142 * has not yet been finished with the {@link #exit} method,
143 * {@code false} otherwise
144 */
145 public boolean exit();
146
147}