Интерфейс SecondaryLoop
public interface SecondaryLoop
Объекты, реализующие этот интерфейс, создаются с помощью метода EventQueue.createSecondaryLoop(). Интерфейс предоставляет два метода — enter() и exit(), — которые можно использовать для запуска и остановки цикла событий.
При вызове метода enter() текущий поток блокируется до завершения цикла методом exit(). Также в потоке диспетчеризации событий запускается новый цикл событий, который может выполняться как в текущем потоке, так и в другом. Цикл можно завершить в любом потоке, вызвав его метод exit(). После завершения цикла объект SecondaryLoop можно использовать повторно для запуска нового вложенного цикла событий.
Типичный пример применения этого интерфейса — модальные диалоги AWT и Swing. Когда модальный диалог отображается в потоке диспетчеризации событий, он запускает новый вторичный цикл. Позже, когда диалог скрывается или закрывается, цикл завершается, и поток продолжает выполнение.
В следующем примере показан простой вариант использования вторичных циклов:
SecondaryLoop loop;
JButton jButton = new JButton("Button");
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Toolkit tk = Toolkit.getDefaultToolkit();
EventQueue eq = tk.getSystemEventQueue();
loop = eq.createSecondaryLoop();
// Spawn a new thread to do the work
Thread worker = new WorkerThread();
worker.start();
// Enter the loop to block the current event
// handler, but leave UI responsive
if (!loop.enter()) {
// Report an error
}
}
});
class WorkerThread extends Thread {
@Override
public void run() {
// Perform calculations
doSomethingUseful();
// Exit the loop
loop.exit();
}
}
- Начиная с версии:
- 1.7
- См. также:
Краткое описание методов
Подробное описание методов
enter
boolean enter()
Этот метод может быть вызван любым потоком, включая поток диспетчеризации событий. Этот поток будет заблокирован до вызова метода exit() или завершения цикла. В любом случае в потоке диспетчеризации событий будет создан новый вторичный цикл для обработки событий.
Этот метод может запускать только один новый цикл событий на объект одновременно. Если этот объект уже запустил вторичный цикл событий, который всё ещё выполняется, метод возвращает false, указывая на то, что запустить новый цикл событий не удалось. В противном случае этот метод блокирует вызывающий поток и позднее возвращает true после завершения нового цикла событий. После этого данный объект можно снова использовать для запуска нового цикла событий.
- Возвращает:
-
trueпосле завершения вторичного цикла, если вторичный цикл был запущен этим вызовом; в противном случае —false
exit
boolean exit()
enter(), и завершает вторичный цикл. Этот метод возобновляет выполнение потока, вызвавшего метод enter(), и завершает вторичный цикл, созданный при вызове метода enter().
Обратите внимание: если во время выполнения этого цикла запущен другой вторичный цикл, заблокированный поток возобновит выполнение только после завершения вложенного цикла.
Если этот вторичный цикл не был запущен методом enter() или уже был завершён методом exit(), этот метод возвращает
false; в противном случае возвращается true.
- Возвращает:
-
true, если этот цикл был ранее запущен и ещё не был завершён методомexit(); в противном случае —false
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.desktop/java/awt/SecondaryLoop.html