Интерфейс 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();
}
}
- Since:
- 1.7
- См. также:
Краткое описание методов
Подробное описание методов
enter
boolean enter()
Этот метод может быть вызван любой нитью, включая нить обработки событий. Эта нить будет заблокирована до тех пор, пока не будет вызван метод exit() или цикл не будет завершен. В любом случае будет создан новый вторичный цикл на нити обработки событий для обработки событий.
Этот метод может начать только один новый цикл событий за раз для одного объекта. Если вторичный цикл событий уже был запущен этим объектом и в настоящее время работает, этот метод возвращает false чтобы указать, что ему не удалось запустить новый цикл событий. В противном случае этот метод блокирует вызывающую нить и затем возвращает true при завершении нового цикла событий. В этот момент этот объект снова может быть использован для запуска другого нового цикла событий.
- Возвращает:
-
trueпосле завершения вторичного цикла, если вторичный цикл был запущен этим вызовом,falseв противном случае
exit
boolean exit()
enter(), и выходит из вторичного цикла. Этот метод возобновляет выполнение нити, которая вызвала метод enter(), и выходит из вторичного цикла, который был создан при вызове метода enter().
Обратите внимание, что если любой другой вторичный цикл запущен во время работы этого цикла, заблокированная нить не возобновит выполнение до тех пор, пока вложенный цикл не будет завершен.
Если этот вторичный цикл не был запущен методом enter(), или этот вторичный цикл уже завершен методом exit(), этот метод возвращает
false, в противном случае возвращается true.
- Возвращает:
-
trueесли этот цикл был ранее запущен и еще не завершен методомexit(),falseв противном случае
© 1993, 2021, 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/17/docs/api/java.desktop/java/awt/SecondaryLoop.html