Executor服务或守护程序线程哪个更适合多线程?

时间:2018-06-13 05:21:48

标签: java multithreading daemon load-testing

抱歉长时间编辑

我正在尝试下载100k网址,我开始使用执行程序服务下载,如下所示

user
  - info
    - id
    - nickname
    - ...
  - inventory
    - user_id
    - item_id
    - ...
  - quest
    - user_id
    - quest_id
    - ...

item
  - info
    - id
    - min_level
    - description
    - ...

game
  - quest
    - id
    - min_level
    - ...

但上面的方法一次只下载一个网址..

所以我尝试创建守护程序线程(如下所示),并且此方法创建了多个下载连接(如预期的那样)..

ExecutorService executorService = Executors.newFixedThreadPool(100);
for (int i = 0; i < list.size(); i++) {
    try {
        Callable callable = new Callable() {
            public List<String> call() throws Exception {
                //http connection
            }
        };
Future future = executorService.submit(callable);

可以使用相同的方法在服务器上进行负载测试吗?

关于如何进行负载测试的任何其他建议也会有很大的帮助..

提前致谢!

3 个答案:

答案 0 :(得分:2)

我猜测你的ExecutorService无法正常工作,因为你在循环中返回get()个实例上调用了Future这个错误确实会导致您的处理序列化,就像您只有一个线程一样,因为在第一个完成之前不会提交另一个任务。

如果您确实需要使用Callable,请不要get()结果,直到您准备好在任务完成时无限期地阻止它们 - 如果它们没有完成则无法完成尚未提交。对于下载URL,最好使用Runnable,其中主线程提交URL然后忘记任务;任务可以独立完成其URL的处理。

如果您快速生成新任务,则有可能排队太多以至于内存不足。在这种情况下,您可以使用有界队列并直接使用ThreadPoolExecutor设置适当的拒绝处理程序。

答案 1 :(得分:0)

守护程序线程是一个线程,它不会阻止JVM在所有其他线程完成时退出。

我相信如果你想等待你的主线程,直到时间守护程序线程没有完成,那么我建议不要使用守护程序线程,因为它不应该用于该用例。您可以使用Thread#join等待主线程。

for(int i=0; i<10; i++) {
    Thread t = new Thread("loadtest " + i);
    t.setDaemon(true);
    t.start();
    t.join(); // main or parent thread will wait util the child thread finished 
}

我相信你的用例你应该使用普通线程而不是守护进程。

答案 2 :(得分:0)

负载测试不仅仅是通过请求“锤击”您的服务器,使用真实浏览器以及所有相关内容代表真实用户的良好负载测试需求:

因此我建议使用能够尽可能接近真实用户并自动处理上述要点的专业load testing tool。通常,负载测试工具允许您设置rendezvous points并提供大量指标和图表,以便您能够查看连接时间,网络延迟,吞吐量,将增加的负载与增加的响应时间/错误数量相关联,等。