2 binduqin binduqin 于 2016.03.21 15:16 提问

多线程循环访问不同的IP,这个应该怎么设计?

多线程循环访问不同的IP,这个应该怎么设计?我这里有100个IP。比如我现在我启动了3个线程,我想用这3个线程一直遍历这100个IP。比如:
线程1访问ip1
线程2访问ip2
线程3访问ip3
线程1访问ip4
线程2访问ip5
线程3访问ip6
。。。。

线程2访问ip99

线程3访问ip100

访问到ip100之后,继续这样的遍历。

就这样一直循环遍历。

这样的代码应该这么设计?

2个回答

u014481698
u014481698   2016.03.21 15:26

做一个线程安全的管理器,线程每次上管理器去请求要访问的IP。管理处理遍历。

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.03.21 17:17

由于你的任务是处理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线程不停派发任务,由线程池处理任务,不涉及到同步问题的。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!