同时发出 JSoup 请求
Make simultaneosly JSoup requests
我必须向我的服务器发送多个 http 请求,并希望以同时(多线程)方式进行。
以下是我到目前为止开发的代码。这是 Main
class 中的我检索 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
class 实现了 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 请求并做一些事情的请求 class:
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
}
}
最后,启动线程的多线程class:
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
我必须向我的服务器发送多个 http 请求,并希望以同时(多线程)方式进行。
以下是我到目前为止开发的代码。这是 Main
class 中的我检索 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
class 实现了 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 请求并做一些事情的请求 class:
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
}
}
最后,启动线程的多线程class:
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