2010-07-03 9 views
2

독립적으로 작동하는 스레드 풀이 있습니다. 기본적으로 이러한 스레드는 웹 사이트에서 데이터를 가져옵니다. 또한 시스템 IP를 변경하는 또 다른 스레드가 있습니다. 다른 스레드가 ip를 변경하는 동안 다른 모든 스레드를 일시 중지해야합니다. ip가 변경되면 다른 스레드 풀이 다시 시작됩니다.Java 일시 중지 실행

해결책이 있습니까? 여기

내 코드입니다 :

for(;;){ 
    for (int aa = 0; aa < pages.size(); aa++) { 
    if (pageID != null) { 
     t = new Thread(new BackgroundThread(pageID.get(aa))); 
     System.out.println(pageID.get(aa)); 
     t.start(); 
    } 
    if(ipNo == 3){ 
     ipNo = 0; 
    } 
    if(aa == 35) { 
     //Following method take a little bit time to change ip. I need when this method will be executin then 
     //all above threads "t" will be paused 
     IPRotator.rotateIP(ip[ipNo]); 
     //When IP will be change then all paused threads will be resumed 
     ipNo++; 
    } 
    } 
} 
+3

난 당신이 어쨌든 여기 불법적 인 일 : 을하고 있다고 생각 - 스레드가 '동안 (사실)'그들에해야합니까? 몇 가지 코드를 보여주십시오. – Bozho

+0

긍정적 인 생각하세요! 불법적 인 물건이 아니라 NIC IP를 변경하고 있습니다 !!! ;-) – Novice

+0

코드에 대한 마크 업을 사용하십시오. – MAK

답변

2

정말로 컴퓨터 IP를 변경한다는 의미인가요? 스레드가 시스템 IP를 변경할 수있는 상태에 있는지, 그리고 IP 변경을 위해 모든 스레드가 일시 중지 될 때까지 시스템 IP 체인저가 대기해야하는지 확인해야합니다.

이 작업은 CountDownLatch를 사용하여 스레드가 일시 정지해야 함을 나타낼 수 있습니다. 각 스레드는 래치를 카운트 다운합니다. 모든 스레드가 래치에 도달하면 시스템 IP 업데이터가 진행될 수 있습니다. 작업이 완료되면 래치를 null로 설정하여 스레드를 다시 시작합니다.

명확성을 위해 예외 처리가 생략되었습니다.

class SystemIPChanger implements Runnable { 
     Collection<WorkerThread> pool; 

     public void changeIP() { 
      pauseAllThreads(); 
      changeIP(); 
      resumeThreads(); 
     } 

     void pauseAllThreads() { 
      CountDownLatch latch = new CountDownLatch(pool.size()); 
      for (WorkerThread worker : pool) { 
       worker.setPause(latch); 
      } 
      latch.await();   
     } 

     void resumeThreads() { 
      for (WorkerThread worker : pool) { 
       worker.setPause(null); 
      } 

     } 
    } 

    class WorkerThread implements Runnable { 
    private CountDownLatch pause; 

    public void run() { 
     while (...) { 
      pause(); 
      doRealWork(); 
     } 
    } 


    synchronized void pause() { 
     CountdownLatch latch = pause; 
     if (latch!=null) { 
      latch.countDown(); 
      while (pause==latch) { 
       wait(); 
      } 
     } 
    } 

    public synchronized void setPause(CountDownLatch latch) { 
     this.pause = latch; 
     notifyAll(); 
    } 
    } 
2

어떻게 읽기/쓰기 잠금 장치의 일종을 사용하는 방법에 대해? 쓰레드는 정상적인 작업을하며 (상대적으로 작은 덩어리로 적시에 중단 될 수 있습니다) 독자로, IP를 변경해야하는 쓰레드는 작가로 사용됩니다.

+0

답변 해 주셔서 감사합니다. 내 질문을 편집했습니다. 그것을보고 조언 해주세요. 어떻게하면 읽기/쓰기 잠금을 구현할 수 있습니까? – Novice

+0

@rmarimon이 제시 하듯이, ReentrantReadWriteLock과 같은 Java 독자적인 ReadWriteLock 구현 : http://java.sun.com/j2se/1.5.0/docs/api /java/util/concurrent/locks/ReentrantReadWriteLock.html)은 분명한 대답이며 아마도 가장 좋은 옵션입니다. 더 많은 전문가 버전이있는 다른 라이브러리가 있지만 다른 것을 필요로 할 때 찾아야합니다. – pdbartlett

관련 문제