2012-11-25 2 views
0

여기는 스레드를 사용하여 작성한 작은 프로그램의 스 니펫입니다.Thread not staying alive - IllegalStateException

JOptionPane.showMessageDialog(null, "Before: " + thread.isAlive()); 
if (!thread.isAlive()) { 
    JOptionPane.showMessageDialog(null, "Thread is not alive."); 
    thread.start(); 
} 
JOptionPane.showMessageDialog(null, "After: " + thread.isAlive()); 

이 코드는 버튼을 사용하여 활성화됩니다. 처음 버튼을 누르면 "Before : false"와 "After : true"가 올바르게 표시됩니다. 버튼을 다시 누르면 "Before : false"와 "After : true"가 잘못 표시되지만 Before : true는 스레드를 파기하거나 변수를 무시하지 않기 때문입니다.

나는 이것이 내가 (내가 너무 그것에 대한 잘못된 생각하면 날 수정!)

사람이 내가 잘못 뭐하는 거지 나에게 설명 할 수 무엇입니까 IllegalStateException이 원인이 무엇이라고 생각?

편집 :

public class SomeClass extends Applet 
{ 

private ClassThatExtendsThread thread; 

public void init() 
{ 
    super.init(); 

    //Some UI elements are created here. 

    thread = new ClassThatExtendsThread (/*there are some parameters*/); 
} 
+0

어디서'스레드 '를 어떻게 초기화하고 있습니까? – NPE

+1

*이게 내가 얻고있는 IllegalStateException의 원인이라고 생각합니다 * : * this * *? 예외의 전체 스택 추적은 무엇입니까? 차라리 이것이 예외의 * 결과 *라고 말하면 스레드가 죽는 원인이 될 수 있습니다. –

+0

스레드 클래스가 저장되고 인스턴스화되는 방법을 추가했습니다. –

답변

2

스레드가 실행 완료되면 죽은 것으로 간주됩니다. 이 시점에서 동일한 스레드에서 isAlive을 호출하면 항상 false의 결과가 반환됩니다.

 
public final boolean isAlive() 

Tests if this thread is alive. A thread is alive if it has been started and has not 
yet died. 

그런 다음 당신은 확실히 (자), IllegalStateException를 얻을 것이다 코드를 호출 사이에 - 스레드 인스턴스를 다시 인스턴스화되지 않은 경우 : JavaDoc for Thread이 언급한다. 당신은 적어도 오류를 분석하는 데 도움이해야 getState 방법을 통해 스레드 상태를 조회 할 수 있습니다, 미래의 참고

if (!thread.isAlive()) { 
    JOptionPane.showMessageDialog(null, "Thread is not alive."); 
    thread.start(); 
} 

: 이미 종료 된 스레드를 시작하려고하기 때문이다.

+0

run() 함수의 끝에 도달하면 실행이 끝나니? 이 클래스 내의 다른 버튼이 스레드에서 실행되지 않는 다른 함수를 호출하도록 허용하려면 어떻게해야합니까(). 내부 루프가 달린 것일까 요? 그러나 그때 그것은 결코 끝나지 않을 것입니다. –

+0

그래서 어떻게 종료하지 못하나요? 나는 내부에서 모든 것을 잃어 버리기 때문에 실제로 다시 인스턴스를 만들고 싶지 않습니다. –

+0

당신이하고있는 일은 쓰레드의 유스 케이스처럼 들리지는 않습니다. 원하는 것은 메인 UI에서 발생하는 이벤트를 기반으로 디스패치 할 수있는 리스너 클래스입니다. – Perception

0

는 클래스의 구성원으로 스레드 변수를 저장하고 한 번만 작성해야합니다. 아마 당신은 로컬 변수로 저장하고 버튼을 누를 때마다 그것을 생성 할 것입니다.

+0

스레드 클래스가 저장되고 인스턴스화되는 방법을 추가했습니다. –

+0

스레드가 수행하는 작업은 무엇입니까? –

+0

몇 가지 내부 변수 변경, 그 이상. –