2011-01-29 3 views
0

안녕하세요 .. 일부 사람들을 체크인하는 프로그램이 있습니다. 부서가있는 경우 prog에 목록이있는 패널이 표시됩니다 ..Thread.sleep (xx)하지만 전체 프로그램이 잠자기 상태입니까?

그래서 몇 번 지나면 패널이 보이지 않도록 설정하고 싶습니다. 초. 어떻게 그럴 수 있니?

나는 새로운 Thread (FadeThread)를 생성하고,보기에서 시작했지만 지금은 내가

Thread.sleep(5000) 

쓸 때 전체 프로그램은 .. 난 단지 백그라운드에서 대기하는,이 오초 동안 휴면 5 초 동안 표시하고 패널을 표시 (false)하지만 전체 UI 및 프로그램이 잠자기 상태가됩니다 ..

감사합니다 ... .

+1

짧은 코드 샘플을 제공하면 도움이 될 것입니다. – pnt

+1

* 시작 * 대신 * 실행 * (또는 다른 방법 이었습니까?)입니까? IIRC, * run *을 직접 호출하면 실제로 새 스레드가 시작되지 않고 스레드의 "main method"가 현재 스레드의 컨텍스트에서 실행됩니다. – esaj

답변

5

Thread.sleep()은 현재 스레드를 일시 중단합니다. 귀하의 경우에는 이벤트 디스패처 스레드라고 가정합니다. 백그라운드 스레드에서 수행하는 경우 실수로 대신 run()을 호출하더라도 작동하지 않습니다.

지연이 설정된 코드를 실행하려면 Timer 클래스를 사용해야합니다. 훨씬 더 깔끔하고 실수로 너무 많은 쓰레드를 생성하고, 쓰레드를 적절히 종료하지 않도록 걱정할 필요가 없습니다.

+0

아니요, Timer는 새 스레드를 사용하고 패널을 숨기려고합니다. 두 가지가 잘못되었습니다. a) 스윙은 스레드 안전하지 않으며 b) 타이머는 요즘의 예약 된 실행 프로그램에 비해 상당히 쓸모 없습니다. – berry120

+1

@ berry120 Timer는 충분하다. 물론 invokeLater()를 사용하여 UI를 업데이트 할 것이다. – biziclop

+0

@biziclop 좋은 점은'invokeLater()'를 사용하여 업데이트하면 스레드 세이프가된다는 점입니다. 그래도 대신 ScheduledExecutor를 사용하는 것을지지합니다. – berry120

3

GUI가 이벤트에 반응 할 수 없도록 이벤트 발송 쓰레드가 잠자기 상태가됩니다.

자세한 내용과 잠재적 인 해결책은 Concurrency에있는 스윙 튜토리얼의 섹션을 참조하십시오.

1

스윙을 사용한다고 가정하면 SwingWorker 클래스를 살펴보십시오. 5 초 동안 차단 한 프로세스를 생성 한 다음 스레드로부터 안전하게 패널을 숨길 수 있습니다.

invokeLater()을 사용하여 EDT에서 실행되도록 설정 한 경우 ScheduledExecutor를 사용할 수도 있습니다.

관련 문제