首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >同时提出JSoup请求

同时提出JSoup请求
EN

Stack Overflow用户
提问于 2017-03-15 15:18:12
回答 1查看 323关注 0票数 1

我必须发送多个http请求到我的服务器,并希望以一种同时(多线程)的方式。下面是我到目前为止开发的代码。这是Main类,我检索了CPU的核数,并创建了与内核一样多的线程。

代码语言:javascript
运行
复制
public class Main {
private static LinkedBlockingQueue<Request> reqList = new LinkedBlockingQueue<Request>();

public static void main(String[] args) throws IOException {        

    Integer countOfThreads = Runtime.getRuntime().availableProcessors();  

    Worker worker1 = new Worker(new Request("sxafsfle9il.comasfasf","bfasf91"));
    Worker worker2 = new Worker(new Request("sxafsfle9il.comasfasf","bfasf91")); 

    MultiThreading.start(countOfThreads, worker1);
    MultiThreading.start(countOfThreads, worker2);

}
}

Worker类实现了Runnable接口,并在一个单独的线程中运行每个任务:

代码语言:javascript
运行
复制
public class Worker implements Runnable {
  private Request reqToChecking;

  public Worker(Request req) {
      this.reqToChecking = req;
  }

  @Override
  public void run() {        

       try {

           reqToChecking.callWebServer();

       } catch (IOException ex) {
           Logger.getLogger(Worker.class.getName()).log(Level.SEVERE, null, ex);
       }

   }

}

使用JSoup发出http请求并执行某些操作的请求类:

代码语言:javascript
运行
复制
public class Request {
   private String param1;
   private String param2;

   public Request(String p1, String p2) throws IOException {        
     param1 = p1;
     param2 = p2;
   }

   public void callWebserver() throws IOException {
     // send some requests to server

   }
 }

最后,启动线程的多线程类:

代码语言:javascript
运行
复制
public class MultiThreading {
    public static  void start(Integer numberOfThread, Runnable task) {
        ExecutorService threadPool = Executors.newFixedThreadPool(numberOfThread);
        //threadPool.submit(task);
        threadPool.execute(task);
        threadPool.shutdown();
    }
}

这个多线程版本比没有多线程的版本只快几秒钟。在你看来,上面的代码正确吗?如果没有,您能给出一些改进代码的建议吗?提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-15 16:14:48

线程是有代价的。因此,您节省的时间必须考虑到这一成本,此外,执行的时间要比顺序代码的时间短。

在某些情况下,它们可能不值得。

在您的情况下,秒可以是一个巨大的节省相对而言。考虑到某些操作可以在微秒或更短的时间内测量。

这一行:

代码语言:javascript
运行
复制
 threadPool.shutdown();

是乐观的。如果其中一个线程被卡住,那么它就永远不会关闭。

编辑

代码语言:javascript
运行
复制
 ExecutorService threadPool = Executors.newFixedThreadPool(numberOfThread);

只需要使用一次。在方法之外。

我通常在调用关机之前使用一个时间来检查活动计数。如果超过了,就可以采取适当的行动。

在伪码中:

代码语言:javascript
运行
复制
loop a number of times
if threadPoolExceutor.getActiveCount() != 0
sleep certain amount
else
break out of loop

if loop was completed
 check  still running threads.
else
 success
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42813827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档