gpt4 book ai didi

java - 同时发出 JSoup 请求

转载 作者:行者123 更新时间:2023-11-30 06:50:49 26 4
gpt4 key购买 nike

我必须向我的服务器发送多个 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 接口(interface)并在单独的线程中运行每个任务:

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);

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

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

伪代码:

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

关于java - 同时发出 JSoup 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42813827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com