2013-07-20 3 views
2

주 스레드가 프레임을 만든 후에는 이벤트 디스패처 시스템에서 생성 된 비 데몬 스레드로 인해 JVM이 종료되지 않습니다. 하지만 내 질문은 메인 스레드가 스택을 끝내 자 마자 프레임의 참조가 더 이상 존재하지 않게되어 프레임 객체가 언제든지 가비지 수집 될 수있게된다. 그러나 이것은 왜 일어나지 않는가?주 스레드가 종료 된 경우에도 프레임이 표시되는 방법

답변

3

참고 : Swing 이벤트 스레드는 비 데몬 스레드이므로 실행 중에 응용 프로그램이 종료되지 않습니다.

하지만

하지만 내 질문은 바로 메인 쓰레드 프레임의 참조가 더 이상 그래서 프레임 객체가 언제든지 가비지 수집이 될 수 없을 것이다 그래서도 사라질 것입니다 스택 것 종료되었습니다입니다.

이것은 GC로 표시된 개체를 만드는 것이 아닙니다. 액티브 쓰레드에는 액티브 참조가 없어야하며 EDT로 인해이 조건이 충족되지 않았습니다.

개체는 더 이상 해당 개체에 대한 참조가 없을 때 가비지 수집 대상입니다. 변수에 포함 된 참조는 일반적으로 변수가 범위를 벗어날 때 삭제됩니다. 또는 변수를 특수 값 null로 설정하여 객체 참조를 명시 적으로 삭제할 수 있습니다. 프로그램은 동일한 객체에 대해 여러 참조를 가질 수 있음을 기억하십시오. 오브젝트에 대한 모든 참조는 오브젝트가 가비지 콜렉션 대상이되기 전에 제거되어야합니다. ref


편집
당신의 상태 코멘트에/내 답변 :

나는 그것의 이벤트가 이벤트 큐에 갈 수 있도록 버튼, 클릭 처음으로 말을 의미

, 이벤트 디스패처 머신은 수행 된 작업을 실행할이 이벤트에 대한 EDT를 생성합니다.

아니요. GUI가 표시되면 바로 스윙 EDT가 만들어집니다. 따라서 GUI에서 버튼을 볼 수 있다면 GUI가 생성되어 실행중인 EDT에 표시됩니다. 버튼을 누르면 EDT가 생성되지 않습니다. 대신 Runnables는 EDT가 처리 할 이벤트 대기열에 대기열에있을 수 있습니다.

이제 실행이 끝난 후 다시 이벤트가 이벤트 대기열로 들어가고, 이제는 동일한 스레드가 두 번 시작될 수 없으므로 머신이 다른 스레드를 시작해야합니다.

다시 아니요. 지속적으로 운영되는 EDT는 하나뿐입니다. new Thread(...).start()을 통해 새 스레드을 명시 적으로 작성하고 시작하지 않거나 SwingWorker 개체에서 execute()을 호출하면 새 스레드가 생성되지 않습니다.

+0

프레임을 만들었지 만 표시하지 않으면 JVM이 주 스레드가 죽으면 곧 종료되어 EDT가 언제 만들어 집니까? – user2594479

+0

@ user2594479 : 스윙 GUI가 렌더링되고 표시되지 않으면 EDT가 시작되지 않습니다. –

+0

답해 주셔서 감사합니다. 나는 의심이 하나 더있다. 버튼을 클릭하면 EDT가 생성되고 실행 된 코드가 실행되므로이 ​​코드를 실행하면 EDT가 종료됩니까?동일한 EDT가 메서드를 다시 실행하거나 새 스레드가 시작될 수 있도록 동일한 버튼을 두 번 클릭한다고 말합니다. – user2594479

관련 문제