Вот код:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.Timer;
public class TimerSample {
public static void main(String args[]) {
new JFrame().setVisible(true);
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
System.out.println("Hello World Timer");
}
};
Timer timer = new Timer(500, actionListener);
timer.start();
}
}
Генерирует окно, а затем периодически печатает «Hello World Timer» в терминале (командная строка). Если я прокомментирую эту строку new JFrame().setVisible(true);
, приложение ничего не выводит в командную строку. Почему?
ДОБАВЛЕНО:
Я не уверен, что правильно понимаю ответы. Насколько я понял, таймер запускает новый поток. И этот новый поток существует одновременно с «основным» потоком. Когда «основной» поток завершен (когда все сделано, и больше нечего делать), все приложение завершается (вместе с «новым» потоком, созданным таймером). Правильно?
ДОБАВЛЕНО 2:
Вышеописанное объяснение все еще не объясняет все. Например, программа работает, если я прокомментирую new JFrame().setVisible(true);
и поставлю try {Thread.sleep(20000);} catch(InterruptedException e) {};
после timer.start()
. Итак, я вроде это понимаю. В спящем режиме мы сохраняем «основной» поток занятым, чтобы созданный таймер поток мог существовать. Но new JFrame().setVisible(true);
не занимают "главное". Насколько я понимаю, он создает свой собственный поток (например, таймер). Итак, почему поток JFrame может существовать без основного потока, а поток таймера не может?