论坛首页 Java版 Spring

一个关于线程的问题

浏览 799 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2008-06-02 关键字: thread, java, 超时
描述:在一个for循环中(如100次)需要做一些事情(如连接网络,提取网数据等)但由于网原因可能会出现这样那样的原因,程序就可能不动了,于是我想写一个监听线程来监视每次for循环所耗的时间,如果超过指定时间(1分钟)就退出当前循环,继续下次循环!
请叫我该如何实现,谢谢了!
   
时间:2008-06-03
如果有可能出现这种阻塞就不要用循环了,用ThreadPerMessage模式处理,如果任务比较重要,可以用回调确保哪些任务完成了。
   
0 请登录后投票
时间:2008-06-03
如果我用for循环该怎么做呢?请教啊
   
0 请登录后投票
时间:2008-06-03
硬要用你说的那种for形式的话:
第一种方法.在两个线程之间共享的你的woker对象,一个线程是工作运行worker,一个线程进行计时操作,
在worker里面设置一个boolean,用来描述到底要不要继续运行,在超时的情况下把这个boolean设置为
不要继续运行.
这样的方法有一个问题就是如果在检测到超时的时候,运行worker的线程还在经历长时间的阻塞等待的话
不能迅速地响应.
第二种方法就是计时线程拥有一个运行worker的线程的引用,在检测到超时的时候如果那个线程还在运行的话,
强行interrupt.
这一种方法优点是响应比较迅速.
   
0 请登录后投票
时间:2008-06-03
java.net.URLConnection有一个方法setReadTimeout
   
0 请登录后投票
时间:2008-06-04
qubic 写道
java.net.URLConnection有一个方法setReadTimeout

setReadTimeout 也只是网连接超时间,但实际情况还有其它的一些因数,
说简单点就是在一个for循环中,如何想办法让该循环是否超过预期是时间,超过就退出当前循环,继续下次循环!
   
0 请登录后投票
时间:2008-06-05
个人认为比较合适你的方法是每个循环创建一个线程,这样for循环线程不会被阻塞,所有对应你所说的“一些事情(如连接网络,提取网数据等)”如何处理则由子线程本身去控制,应该更为灵活。
例如:你可以先在你的类里创建一个实现Runnable 的内部类
class XXXX implements Runnable {

public void run() {
// 一些事情
}

}
然后在你的循环里写上:
XXXX test = new XXXX ();
Thread thread1 = new Thread(test);
thread1.start();
即可。
   
0 请登录后投票
时间:2008-06-05
把需要做的一些事情(如连接网络,提取网数据等)放在工作线程中。

主线程启动工作线程后,就监视工作线程的进度,发现超时后,
杀掉超时的工作线程,再启动新的工作线程。
   
0 请登录后投票
时间:2008-06-05
参考一下
java.util.concurrent.Future
   
0 请登录后投票
时间: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);
}


应该可以满足你的要求了。
   
0 请登录后投票
论坛首页 Java版 Spring

跳转论坛:
JavaEye推荐