我有一个独立工作的线程池。基本上这些线程从网站获取数据。我还有另一个更改我的系统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++;
}
}
}
答案 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。