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

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接口,并在单独的线程中运行每个任务:

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请求并执行一些操作的Request类:

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

   }
 }


最后,启动线程的Multithreading类:

public class MultiThreading {
    public static  void start(Integer numberOfThread, Runnable task) {
        ExecutorService threadPool = Executors.newFixedThreadPool(numberOfThread);
        //threadPool.submit(task);
        threadPool.execute(task);
        threadPool.shutdown();
    }
}


与没有多线程的版本相比,此多线程版本仅快几秒钟。
您认为上面的代码正确吗?如果没有,您可以提出一些建议来改进此代码吗?
提前致谢。

最佳答案

线程是有成本的。因此,您节省的时间必须解决这一成本,并且执行时间要比顺序代码少。

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

就您而言,相对而言,秒可以节省很多。请注意,某些操作可以在几微秒或更短的时间内进行测量。

这行:

 threadPool.shutdown();


是乐观的如果其中一个线程卡住,则它将永远不会关闭。

编辑

 ExecutorService threadPool = Executors.newFixedThreadPool(numberOfThread);


只需要使用一次。外面的方法。

我通常会在调用关闭之前使用生存时间来检查活动计数。如果超过该限制,则可以采取适当的措施。

用伪代码:

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

09-30 15:08