浏览 799 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2008-06-02 关键字: thread, java, 超时
描述:在一个for循环中(如100次)需要做一些事情(如连接网络,提取网数据等)但由于网原因可能会出现这样那样的原因,程序就可能不动了,于是我想写一个监听线程来监视每次for循环所耗的时间,如果超过指定时间(1分钟)就退出当前循环,继续下次循环!
请叫我该如何实现,谢谢了! 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2008-06-03
如果有可能出现这种阻塞就不要用循环了,用ThreadPerMessage模式处理,如果任务比较重要,可以用回调确保哪些任务完成了。
|
|
| 返回顶楼 | |
|
时间:2008-06-03
如果我用for循环该怎么做呢?请教啊
|
|
| 返回顶楼 | |
|
时间:2008-06-03
硬要用你说的那种for形式的话:
第一种方法.在两个线程之间共享的你的woker对象,一个线程是工作运行worker,一个线程进行计时操作, 在worker里面设置一个boolean,用来描述到底要不要继续运行,在超时的情况下把这个boolean设置为 不要继续运行. 这样的方法有一个问题就是如果在检测到超时的时候,运行worker的线程还在经历长时间的阻塞等待的话 不能迅速地响应. 第二种方法就是计时线程拥有一个运行worker的线程的引用,在检测到超时的时候如果那个线程还在运行的话, 强行interrupt. 这一种方法优点是响应比较迅速. |
|
| 返回顶楼 | |
|
时间:2008-06-03
java.net.URLConnection有一个方法setReadTimeout
|
|
| 返回顶楼 | |
|
时间:2008-06-04
qubic 写道 java.net.URLConnection有一个方法setReadTimeout setReadTimeout 也只是网连接超时间,但实际情况还有其它的一些因数, 说简单点就是在一个for循环中,如何想办法让该循环是否超过预期是时间,超过就退出当前循环,继续下次循环! |
|
| 返回顶楼 | |
|
时间:2008-06-05
个人认为比较合适你的方法是每个循环创建一个线程,这样for循环线程不会被阻塞,所有对应你所说的“一些事情(如连接网络,提取网数据等)”如何处理则由子线程本身去控制,应该更为灵活。
例如:你可以先在你的类里创建一个实现Runnable 的内部类 class XXXX implements Runnable { public void run() { // 一些事情 } } 然后在你的循环里写上: XXXX test = new XXXX (); Thread thread1 = new Thread(test); thread1.start(); 即可。 |
|
| 返回顶楼 | |
|
时间:2008-06-05
把需要做的一些事情(如连接网络,提取网数据等)放在工作线程中。
主线程启动工作线程后,就监视工作线程的进度,发现超时后, 杀掉超时的工作线程,再启动新的工作线程。 |
|
| 返回顶楼 | |
|
时间:2008-06-05
参考一下
java.util.concurrent.Future |
|
| 返回顶楼 | |
|
时间:2008-06-05
用java.util.concurrent,jdk1.5
for (int i = 0; i < tolist.size(); i++){
//每次新建一个ScheduledThreadPool,容量只有一个线程即可
final ScheduledExecutorService scheduler = Executors
.newScheduledThreadPool(1);
//初始化你的执行体Excutor实现Runnable
final Runnable beeper = new Excutor(arglist);
//为你的执行体设置参数 start开始时间 unit间隔 SECONDS 单位,可以按照你的情况将间隔设置的大于结束时间
final ScheduledFuture beeperHandle = scheduler
.scheduleAtFixedRate(beeper, start, unit, SECONDS);
//设置结束时间stop ,分钟
scheduler.schedule(new Runnable() {
public void run() {
beeperHandle.cancel(true);
scheduler.shutdown();
}
}, stop, SECONDS);
}
应该可以满足你的要求了。 |
|
| 返回顶楼 | |





