在Java中,是否可以执行一个方法一段时间,并在达到时间限制后停止?
我有这段下载网页的代码:
HttpURLConnection connection;
private String downloadContent() {
InputStream content;
Source parser;
try {
content = connection.getInputStream(); //<--here is the download
parser = new Source(content);
content.close();
return parser.toString();
} catch (Exception e) {
return null;
}
}
在下载时,我尝试获取下载的数据量,如果达到限制,我会停止下载,但我没有找到一种方法来做到这一点。如果有人知道该怎么做,请告诉我。
现在我想限制下载时间。示例:如果下载超过 20 秒,我就会停止它。我想这样做是因为我的程序是一个网络爬虫,如果出现错误,它会开始下载一个大文件,它将卡在下载中,这不是我想要做的,所以欢迎按大小过滤下载,但我不知道,过滤时间可以防止这个问题。
I have this code that downloads a web page:
HttpURLConnection connection;
private String downloadContent() {
InputStream content;
Source parser;
try {
content = connection.getInputStream(); //<--here is the download
parser = new Source(content);
content.close();
return parser.toString();
} catch (Exception e) {
return null;
}
}
While doing the download, I tried to get the amount of downloaded data, and if it reaches a limit, I stop the downloading, but I not found a way to do this. If someone know how to do, please tell me.
Now I want to limit the download time. Example: if the download pass 20 seconds, I stop it. I want to do this because my program it's an webcrawler and if by an error, it begins downloading a big file, it will stuck in the download, and is not this I want to do, so a filter in download by size is welcome, but as I don't know, a filter time will prevent this problem.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
实现这一目标的正确方法如下:
The proper way to achieve this is the following:
您可以使用 AOP 和
@Timeable
来自 jcabi-aspects 的注释(我是开发人员):
请注意,您应该定期检查
isInterrupted()
,并在其设置为TRUE
时抛出异常。这是 Java 中终止线程的唯一方法。另外,有关更详细的说明,请查看这篇文章: http: //www.yegor256.com/2014/06/20/limit-method-execution-time.html
You can use AOP and a
@Timeable
annotation from jcabi-aspects (I'm a developer):Pay attention that you should check for
isInterrupted()
regularly and throw an exception when it is set toTRUE
. This is the only way to terminate a thread in Java.Also, for more detailed explanation, check this post: http://www.yegor256.com/2014/06/20/limit-method-execution-time.html
有一个指定的类 java.util.Timer 旨在执行您所需的任务。您可以参考 API 了解更多详细信息。
There is a specified class java.util.Timer that is intended to do the tasks you required.You can reference the API for more detail.
生活很混乱。如果你想自己清理干净,需要做一些工作。
Life is messy. If you want to clean up after yourself, it takes some work.
您无法停止正在运行的线程。但是,您可以执行以下操作:
1) 创建一个新线程并从此线程中获取内容。如果线程回答的时间太长,则继续并忽略其结果。这种方法的缺点:后台线程仍然会下载大文件。
2) 使用另一个具有更多控件的HTTP连接API。我很久以前就使用过“Jakarta Commons HttpClient”,并且对其超时能力非常满意。
You can't stop a running thread. What you can do, however:
1) Create a new thread and fetch the content from this thread. If the thread takes too long to answer, just go on and ignore its results. Downside of this approach: the background thread will still download the big file.
2) Use another HTTP connection API with more controls. I've used "Jakarta Commons HttpClient" a long time ago and was very pleased with its ability to timeout.