多线程循环访问不同的IP,这个应该怎么设计?我这里有100个IP。比如我现在我启动了3个线程,我想用这3个线程一直遍历这100个IP。比如:
线程1访问ip1
线程2访问ip2
线程3访问ip3
线程1访问ip4
线程2访问ip5
线程3访问ip6
。。。。
线程2访问ip99
线程3访问ip100
访问到ip100之后,继续这样的遍历。
就这样一直循环遍历。
这样的代码应该这么设计?
做一个线程安全的管理器,线程每次上管理器去请求要访问的IP。管理处理遍历。
由于你的任务是处理IP,所以可以写一个任务类,然后使用java的线程池来处理任务。
参考代码:先定义任务类:IPHandleTask
public class IPHandleTask implements Runnable{
private String ip;
public IPHandleTask(String ip){
this.ip = ip;
}
@Override
public void run() {
//TODO 处理该IP信息
System.out.println(Thread.currentThread().getName()+"正处理ip:"+ip);
}
}
然后定义主控类,有一个线程池属性,待处理的IP列表,然后就是遍历提交任务。
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MainController {
private ExecutorService executor = Executors.newFixedThreadPool(3);
private List<String> datas ;
public MainController(List<String> datas ){
this.datas = datas;
}
public void submitTask(){
if(datas==null||datas.isEmpty()){
System.out.println("no data to process.");
return;
}
for(String data:datas){
executor.submit(new IPHandleTask(data));
}
//处理完成后关闭线程池
executor.shutdown();
}
public static void main(String[] args) {
String[] s = {"1","2","3","4","5","6","7","8","9","10"};
List<String> datas= Arrays.asList(s);
MainController c = new MainController(datas);
c.submitTask();
}
}
测试Ok,其实只要用线程池就可以满足你的需求,不需要作同步,由主控main线程不停派发任务,由线程池处理任务,不涉及到同步问题的。