2013-08-05 3 views
2

에 가입하지만 난이 예외가 있어요 : 스레드 예외 "주"java.lang.IllegalThreadStateException 의 매니저 스레드 :재시작 자바 스레드 후 나는 방법을 조인을 사용하여 스레드를 죽일이 스레드 를 다시 시작하는 방법을 알고 싶은 방법

public void manage() { 

    while(true) 
    { 
     thread1.start(); 
     try { 
      thread1.join(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     thread2.start(); 
     try { 
      thread2.join(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 
+0

왜 정말 이상한 일을하고 있습니까? 순차적으로 두 개의 스레드를 실행하고 while (true) 루프에서 join()으로 종료 할 때까지 기다리는 이유는 무엇입니까? run() 메서드에 while (true)이 포함되어 있고 thread1과 thread2의 코드를 순차적으로 호출하는 스레드를 한 번만 시작하면 어떨까요? join()이 없으며, 지속적인 스레드 생성/종료/파괴가 없습니다. –

답변

5

Java에서 스레드를 다시 시작할 수 없습니다. 완료되면 완료됩니다.

대신 새 Thread을 생성하고 잠재적으로 동일한 Runnable을 사용해야하며 새 스레드를 시작해야합니다. 편집 : 수도 잠재적으로 새 스레드가 실행되도록 Runnable 같이 "이전"Thread 개체를 사용할 수 있지만 가능하면 그렇게하지 않을 것입니다. 나는 RunnableThread을 아주 분리하여 유지하려고 노력한다. 디자인 실수로 보니 단지 이것을 연장하여 Thread을 만들 수도 있고 ThreadRunnable을 구현합니다.

스레드를 결합하면 이 죽지 않습니다.은 완료 할 때까지 기다리는 것에 유의하십시오. 그것들은 매우 다른 작업입니다. 하나의 쓰레드 (X)가 다른 쓰레드 (Y)와 결합 할 때, Y 내에 어떤 것이 종료되기를 기다리고 있다는 표시가 없습니다. 멈추려 고 시도해야하는 힌트조차도 없습니다.

+0

'new Thread (oldThread)'도 작동한다고 가정합니다 ... – SLaks

+0

@SLaks 스레드가 상당히 무거운 개체라고 생각하면 좋은 생각인지 확신하지 못합니다. – assylias

+0

@SLaks : 잠재적으로,하지만 그것을 피하려고 노력하십시오. 해당 선을 따라 편집합니다. –

2

Java 스레드는 한 번만 실행할 수 있습니다.

다시 실행하려면 Runnable 주위에 새 Thread을 만드십시오.

+0

그러면 join 메소드를 어떻게 사용할 수 있습니까? 그 실을 완성 시키려고? – user2625638

+0

@ user2625638 : 다른 스레드에서'join()'을 호출하는 것과 같은 방법입니다. 그러나 쓰레드를 시작한 후 곧바로'join() '하면 그 쓰레드를 사용할 때 어떤 이점도 얻지 못한다. – SLaks

+0

'runnable' 클래스에서 중요한 값 (처음에'thread'를 멈추게 만들었습니다)을 변경했습니다. 그러므로 나는 똑같은 것을 사용할 수 없었다. 나는'runnable'을 reinstantiate하고 새로운'runnable'에 새로운'Thread'를 생성해야했습니다. –