2011-03-02 2 views
1
Thread t1= new Thread(new Runnable() { 
      public void run() { 
       //perform Database stuff 
      } 
     }); 
t1.start(); 
initCache();//perform other Database stuff (Can this code be executed while thread 1 is running?) 

t1 완료 후 initCache 메소드가 강제로 대기하도록하려면 어떻게해야합니까?스레드와의 가변 간섭

답변

5

시작하려면 다른 스레드에서 실행하지 마십시오?

당신 전화 t1.join()하지만 정말, 당신은 당신 만t1을 실행에 initCache()을 원한다면 ...

0

을, 작업 X 다음 작업 Y를 실행 그냥 같은 스레드를 실행하려면 실행을 마친 후에는 왜 처음에 t1을 시작합니까?

run()에서 코드를 실행하고 initCache()에서 코드를 실행하기 만하면됩니다. t1.start()initCache() 사이에 발생하는 다른 작업이 있다면

, 당신은 initCache()를 호출하기 전에 완료 t1 기다릴 t1.join()를 사용할 수 있습니다.

-1
while (t1.isAlive()) { 
    try { 
    Thread.currentThread().sleep(); 
    } 
    catch (InterruptedException e) { 
    //check again 
    } 
} 
initCache(); 

그렇게해야합니다. 사실 t1.join() 방법이 훨씬 간단합니다.

0

사용 join()? 진심으로? 저수준 동기화 기능을 다시 원하기 때문에 90이 호출 되었습니까?

좀 더 높은 수준은 무엇인가요? CountDownLatch처럼?

final CountDownLatch cdl = new CountDownLatch(1); 
Thread t1= new Thread(new Runnable() { 
      public void run() { 
       //perform Database stuff 
       cdl.countDown(); 
      } 
     }); 
t1.start(); 
cdl.await(); 
initCache(); 

도 * 효과적인 자바 *와 * 내가 동시성 API 저자에 대한 그 외에 인상이었다 * 연습에서 자바 동시성이 정말하지 않았다 내 독서에서 등

+0

타임 아웃으로 구성 할 수 있습니다 더 이상 * join() *과 같은 저수준의 것을 사용하는 많은 타당한 이유. 거대한 멀티 스레드 자바 코드베이스를 보았습니다. * join * 또는 * yeld *와 Java가 아직 기억하지 못하는 다른 저수준 호출에 대한 호출은 정확히 제로입니다. – Gugussee

+1

스레드가 끝날 때까지 기다리는 것이 전부라면 다른 개념을 도입 할 필요가 없습니다. CountDownLatch를 도입 할 때 * join *을 호출하는 것보다 * 이점이 * 있습니까? 높은 수준의 추상화는 많은 경우에 훌륭합니다. 그러나 스레드가 끝나기를 기다리고 있다면'join '을 사용하여 무엇이 잘못되었는지 보지 못합니다. OP가 별도의 스레드를 필요로한다는 어떠한 증거도 없다 ... –

+1

'wait()'와'notify()'/'notifyAll()'이 어떻게 피하고 더 나은/더 현대적으로 바뀌어야하는지 이해한다. 대안들도 있지만 여기에도'join()'을 사용할 때의 문제는 보이지 않습니다. 또한 : 이것은 왜 downvotes에 대한 이유입니까? –