2011-04-11 2 views
1

다음 코드를 가지고 있습니다. 누구든지 내 의심을 분명히 할 수 있습니다.스레드 다시 인스턴스화

public static void Main() { 
    Thread thread = new Thread(Display); 
    thread.Start(); 
    Thread.Sleep(5000);  
    // Throws exception, thread is terminated, cannot be restarted. 
    thread.Start() 
} 

public static void Display() { 

} 

스레드를 다시 시작한 것처럼 다시 스레드를 인스턴스화해야합니다. 이것은 새로운 스레드를 생성한다는 것을 의미합니까? 100 개의 재 초기화를 계속하면 100 개의 스레드가 생성되어 성능 문제가 발생합니까?

+0

스레드를 수동으로 생성하는 대신 스레드 풀에서 처리하도록 '표시'를 대기열에 넣을 수 있습니다. – CodesInChaos

+0

실제로 무엇을하려고합니까? 일반적으로 스레드를 유휴 상태로두고 차단하고 다시 작업을 시작하면 스레드 생성 오버 헤드를 피할 수 있습니다. 하지만 실제로, 당신의 실제 문제는 무엇입니까? –

+0

스레드와 스레드간에 차이가 있습니다. 위 코드에서 "thread"스레드를 두 번 시작합니다. 호출중인 Sleep 메서드가 시작한 스레드를 호출하지 않지만 응용 프로그램 기본 스레드 – reggie

답변

3

예. 새 스레드를 만들거나 매번 스레드 풀에 작업을 부여하여 진정한 새 스레드가 생성되지 않도록해야합니다. 스레드를 다시 시작할 수 없습니다.

그러나 작업을 100 번 연속 실행하지 못하면 새 작업을 시작하는 경우의 성능 오버 헤드보다 큰 문제가 있음을 제안합니다.

+0

감사합니다 John. 여러 번 동일한 메소드를 실행하려면 스레드 풀 큐에 여러 번 추가해야합니다. – Lamps

+0

@Bharskar : 또는 구조체를 변경하여 스레드가 * 작동 할 때까지 루프 내에서 루프하도록 * 각 호출에 대한 새 스레드 대신 동일한 새 스레드에서 여러 번 Display를 호출하는 메서드를 갖습니다. –

1

sleep 이후에 스레드를 시작할 필요가 없습니다. 스레드가 자동으로 깨어납니다. 그것은 같은 스레드입니다.

1

우선, 이미 시작된 스레드는 시작할 수 없습니다. 귀하의 예제에서 스레드는 작업이 끝났기 때문에 종료 된 상태입니다.

당신은 사용 상태를 확인할 수 있습니다 : 당신이 전체의 오초 전에 스레드를 깨워하려고

1

Thread.ThreadState? 어떤 경우에는 모니터 (대기, 펄스 등)를 사용하여 시도 할 수 있습니다.

+0

예, 여러 번 실행하고 싶습니다. – Lamps

관련 문제