이 여기에 코드입니다 :창을 생성하지 않으면 타이머가 작동하지 않는 이유는 무엇입니까?
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 타이머"(명령 프롬프트). 이 줄을 주석으로 쓰면 new JFrame().setVisible(true);
응용 프로그램이 명령 줄에 아무 것도 인쇄하지 않습니다. 왜?
ADDED :
나는 내가 제대로 답변을 이해 모르겠습니다. 늘어나는만큼 내가 이해, 타이머는 새로운 스레드를 시작합니다. 그리고이 새 스레드는 "주"스레드와 동시에 존재합니다. "메인"쓰레드가 끝났을 때 (모든 것이 끝났을 때 더 이상 아무것도 할 필요가 없다) 전체 애플리케이션은 (타이머에 의해 생성 된 "새로운"쓰레드와 함께) 종료된다. 맞지?
2 추가 :
전술 한 설명은 여전히 모든 것을 설명하지 않습니다. 예를 들어, new JFrame().setVisible(true);
에 주석을 달고 timer.start()
뒤에 try {Thread.sleep(20000);} catch(InterruptedException e) {};
을 입력하면 프로그램이 작동합니다. 그래서 나는 그것을 이해하고 있습니다. 잠을 자면 타이머가 생성 한 스레드가 존재할 수 있도록 "메인"스레드가 바쁘게 유지됩니다. 그러나 new JFrame().setVisible(true);
은 "메인"을 차지하지 않습니다. 내가 아는 한, Timer와 같은 자체 스레드를 생성한다. 그래서, 왜 JFrame의 스레드가 주 스레드 및 타이머 스레드없이 존재할 수 있습니까?
을 다음
. 그래서이 경우 나는 Timer가 데몬 쓰레드를 사용하고 있다고 의심합니다. 따라서 "메인"쓰레드가 끝나면 데몬 쓰레드와 JVM이 종료됩니다. 반면에 데몬 스레드가 아닌 자신 만의 스레드를 만들면 "메인"스레드와 비 데몬 스레드가 모두 완료 될 때까지 JVM이 종료되지 않습니다. Thread.setDaemon()을 참조하십시오. –timer
를 시작하고 타이머가 살아 남기 위해 메인 스레드의 원인에 대해 당신이 충분히 잠을 두 번째 예에서