gpt4 book ai didi

java - 等待线程中的特定条件变为真

转载 作者:太空宇宙 更新时间:2023-11-04 07:37:24 25 4
gpt4 key购买 nike

我有一个向站点发出 HTTP 请求的应用程序,然后 ant 检索响应,检查它们,如果包含特定关键字,则将 HTTP 请求和响应写入 XML 文件。该应用程序使用蜘蛛来映射站点的所有 URL,然后发送请求(站点地图中的每个 URL 都被馈送到发送请求的单独线程)。这样我就无法知道所有请求何时已发送。最后,我请求将 XML 文件转换为其他格式。因此,为了查明请求何时结束,我使用以下策略:

我将每个请求的时间存储在一个变量中(当新请求的发送时间晚于变量中的时间时,变量将被更新)。我还启动了一个线程来监视这个时间,如果当前时间和变量中的时间相差超过1分钟,我就知道请求的发送已经停止。我为此目的使用以下代码:

class monitorReq implements Runnable{
Thread t;
monitorReq(){
t=new Thread(this);
t.start();
}
public void run(){
while((new Date().getTime()-last_request.getTime()<60000)){
try{
Thread.sleep(30000);//Sleep for 30 secs before checking again
}
catch(IOException e){
e.printStackTrace();
}
}
System.out.println("Last request happened 1 min ago at : "+last_request.toString());
//call method for conversion of file
}
}

这种方法正确吗?或者有没有更好的方法可以实现同样的事情。

最佳答案

您当前的方法并不可靠。您将陷入竞争条件 - 如果线程正在更新时间并且另一个线程正在同时读取时间。此外,在多个线程中处理请求也会很困难。您假设任务在 60 秒内完成..

以下是更好的方法。

如果您事先知道要发出的请求数量,则可以使用 CountDownLatch

main() {
int noOfRequests = ..;
final CountDownLatch doneSignal = new CountDownLatch(noOfRequests);

// spawn threads or use an executor service to perform the downloads
for(int i = 0;i<noOfRequests;i++) {
new Thread(new Runnable() {
public void run() {
// perform the download
doneSignal.countDown();
}
}).start();
}

doneSignal.await(); // This will block till all threads are done.
}

如果您事先不知道请求数,则可以使用 executorService 使用线程池执行下载/处理

主(){

  ExecutorService executor = Executors.newCachedThreadPool();
while(moreRequests) {
executor.execute(new Runnable() {
public void run() {
// perform processing
}
});
}

// finished submitting all requests for processing. Wait for completion
executor.shutDown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.Seconds);

}

关于java - 等待线程中的特定条件变为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16643561/

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