Java暂停执行

时间:2010-07-03 21:02:38

标签: java multithreading

我有一个独立工作的线程池。基本上这些线程从网站获取数据。我还有另一个更改我的系统IP的线程。我只需要暂停所有其他线程,而另一个线程正在更改IP。一旦ip发生变化,其他线程池就会恢复。

有没有解决方案?

这是我的代码:

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 个答案:

答案 0 :(得分:2)

如何使用某种读/写锁?作为读者,线程正常工作(在相对较小的块中,因此它们可以及时中断),并且需要更改IP的线程就像作者一样。

答案 1 :(得分:2)

我假设你真的是说你正在改变机器IP?您需要确保线程处于可以更改系统IP的状态,并且系统IP更换器需要等待所有线程暂停以便更改IP。

可以使用CountDownLatch来指示线程应该暂停 - 每个线程都会对锁存器进行倒计时。当所有线程都已锁定时,系统IP更新程序可以继续。一旦完成它的工作,它就会通过将latch设置为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 :(得分:0)

在java 1.5 api中尝试此类ReadWriteLock