2011-07-05 4 views
-2

스레드를 사용할 수있는 방법이 있습니까? 만약 그렇다면 쓰레드 안전 매너에서 사용하는 방법사용 방법 Thread inside Thread with ThreadSafty

내가이 스레드를 쓰레드 내에서 시도했는데 언젠가 틀린 결과가 나왔다. 스레드로부터의 안전성이 _qryCompoents.prepare (_sdisQueryInfo)에서 다음

for(int i=0; i<numExpression; i++) 
{ 
    final int _i = i; 
    final SDISQueryInfo _qryInfo = sdisQueryInfo; 
    final SDISQueryComponent _qryComponent = qryCompoents; 
    TCreate[i] = new Thread(new Runnable() 
    { 
     public void run() 
     { 
      _qryComponent.prepare(_qryInfo); 
     } 
    }); 
    TCreate[i].setName(_qryInfo.getQueryTerm(_i)); 
    TCreate[i].start(); 
} 
for(Thread t : TCreate) 
{ 
    t.join(); 
} 

내가 부르고 함수를 사용하여 스레드 내부 스레드를 파악하는 방법을 도와주세요. 이 함수는 내부에 스레드를 가지고 있습니다.


죄송합니다. 사과드립니다 ..이 질문을 삭제할 수 없습니다.

+1

@sehe SEO 질문과 비슷한 사운드 :) – cnicutar

+0

스레드 내의 스레드 .... Inception? –

+0

나는 당신이 내가 토론 한 것을 잘못 이해했다고 생각한다. 내가 언급 한 기능은 스레드로 구성되어있다. 그러나 작동하지만 일관성이 없다. 그래서 내가 왜 이런 일이 일어나는지 모르겠다. .. –

답변

2

원칙적으로 다른 스레드에서 시작하는 스레드에는 문제가 없습니다. 스레드간에 실제 차이점은 없습니다 (말하자면 상위 스레드 또는 하위 스레드가 없습니다).

의미 "이 함수는 내부에 스레드가 있습니다 ..."라는 것이 확실하지 않습니다.

다른 스레드가 시작된다고 가정합니다. 당연히 내부 스레드가 다른 스레드와 정보를 공유하지 않는다면 결코 큰 차이를 만들 수 없습니다. 이 경우인지 확인하려면 SDISQueryComponent.prepare에 대한 설명서를 참조해야합니다.

내 생각에 SDISQueryComponent는 스레딩을 염두에두고 설계되었거나 스레드를 시작하지 않는다는 단순한 이유 때문에 스레딩에서 괜찮습니다.

여기에서 가장 중요한 점은 더 많은 스레드를 만드는 것이 컨텍스트 전환 (컨텍스트 전환 오버 헤드 및 잠금)으로 인해 생성 속도가 느려질 수 있다는 점입니다.

그런 경우 일반적인 솔루션에는 스레드 풀과 작업자 큐가 포함됩니다. 그러나 SDISQueryComponent가 스레드 풀을 사용하여 지원하는지 여부를 알 수 없으므로 손에서 벗어날 수 있습니다.

+0

당신에게 귀중한 시간을 주셔서 감사합니다. –

+0

여기에 스레드와 함께 언급 한 코드가 잘 작동합니다. 그 함수 내에서 스레드가 언젠가 정확하고 언젠가는 올바른 결과 (일치하지 않음)가 표시되지 않습니다. 기능 코드도 추가하겠습니다. –

+0

http://download.oracle.com/javase/tutorial/essential/concurrency/pools.html, http://download.oracle .com/javase/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html – sehe