递归执行任务,存在异常,请大侠指点 本帖最后由 tcmis 于 2012-04-11 14:55:35 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 SwingUtilities.invokeLater(new Runnable() {是不是少个了start啊,愚见 // 在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.timerFinished.schedule(new ListenSysOpenFinished(), 2000, 1000);你自己說了是每次,這個是執行一次的還是n次的還有一個我覺得線程中嵌套線程是不是有點不妥(多餘) invokeLater嵌套在run中,當然這應該不是重點。 invokeLater()延迟唤醒线程,哦 oh,sorry, 你有個cancel這樣子的話可以一步步驗證啊,cancel后先驗證下是不是已經不再執行,諸如此類。 cancel能不能完全的取消掉。。 楼主好像没必要用 // 在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.timerFinished.schedule(new ListenSysOpenFinished(), 2000, 1000);定时触发系统,因为你是一个一个执行的,一个执行完了自己触发另一个。当你执行到下面这句,又执行一个任务列,尽管你用了canceltimerFinished.schedule(new ListenSysOpenFinished(), 1000, 2000);从第一次执行任务到第三个线程执行前,也就是在到执行timerFinished.cancel();这句前,如果时间超过了2秒。那不是又会产生一次任务。不知道我分析的对不对。建议延时触发一次就好了。然后引发触发链。 楼上的兄弟分析的有道理, 问题是现在我即使把 timerFinished = new Timer(); // 在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务. timerFinished.schedule(new ListenSysOpenFinished(), 2000, 1000);这句去掉, 然后使用后面的启动任务timerFinished.schedule(new ListenSysOpenFinished(), 1000, 2000);问题是一样的, 我前面其实不是使用TimeTask去执行我的任务, 直接在监听里面递归的 webBrowser.addWebBrowserListener(new WebBrowserAdapter() { @Override public void loadingProgressChanged(WebBrowserEvent e) { if (e.getWebBrowser().getLoadingProgress() == 100) { JDate jDate = new JDate(); allUrls.remove(0); oneByOneOpenSys();// 递归直接打开下一个url } } });但上面的方法为什么不行,,因为去监听(loadingProgressChanged)这个值他是一个并发的执行,我的监听值即使不到100也会继续执行下去,所以我就在里面加了一个TimeTask,目的就是控制必须等到值为100的时候触发下一个任务。。但是都是一样,不知道如何控制,只有监听到这一个值为100就触发下一个任务,或者说递归执行下一个 所以现在的问题就是我需要打开的链接列表是8个(allUrls.size()), 那么有可能循环超过8次。具体的原因我想是我的监听这个地方存在问题, 没有监听到100,也往下面执行了。不知道为什么为出现这样一种情况。 就像8樓說的,你貌似還是沒有用只執行一次的schedule重載方法啊 這個是偽碼,你把執行框架測試成功了我覺得問題就不大了private void openUrl(){ task.scheduleOnce(new ListenSysOpenFinished());//执行一次就好}public class ListenSysOpenFinished extends TimerTask { @Override public void run() { oneByOneOpenSys(); }}public void oneByOneOpenSys() { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { webBrowser.addWebBrowserListener(new WebBrowserAdapter() { @Override public void loadingProgressChanged(WebBrowserEvent e) { if (e.getWebBrowser().getLoadingProgress() == 100) { task.scheduleOnce(new ListenSysOpenFinished()); } } }); } }} private void openUrl(){ task.scheduleOnce(new ListenSysOpenFinished());//执行一次就好}public class ListenSysOpenFinished extends TimerTask { @Override public void run() { oneByOneOpenSys(); }}public void oneByOneOpenSys() { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { webBrowser.addWebBrowserListener(new WebBrowserAdapter() { @Override public void loadingProgressChanged(WebBrowserEvent e) { if (e.getWebBrowser().getLoadingProgress() == 100) { task.scheduleOnce(new ListenSysOpenFinished()); } } }); } }} 楼上的兄弟, 需要重载吗?timer.schedule(task, delay)// delay 为long类型:从现在起过delay毫秒执行一次 直接这样行吗? http://www.cnblogs.com/soarwell/archive/2009/03/18/1415206.html 老大, 那个我早就试过了, 问题是一样的, allUrls.size() 如果等于8,,肯定是循环大于8次, 就是循环的次数总是大于需要循环的次数。 照道理这个程序不需要使用TimeTask,可以直接递归调用一下,, 但是问题还是一样, 不知道这个到底会是什么原因, 而且debug也不好调试。。 webBrowser.addWebBrowserListener(new WebBrowserAdapter() { @Override public void loadingProgressChanged(WebBrowserEvent e) { if (e.getWebBrowser().getLoadingProgress() == 100) { JDate jDate = new JDate(); allUrls.remove(0); oneByOneOpenSys();// 直接调用一下 } } }); 都簡化成這樣了,還有問題?那你意思是會有oneByOneOpenSys()方法莫名的計劃外被調用?不好調試就用打印啊,觀察對象就那麼一個。 public class Example { private Timer timerFinished = null; //你这里是new timer;发现下面就new了一次,结果导致主线程不关闭,还纳闷中 private List<Integer> allUrls = new ArrayList<Integer>(Arrays.asList(1,2,3,4));//所有需要打开的url列表 private void openUrl(){ timerFinished = new Timer(); ListenSysOpenFinished tt = new ListenSysOpenFinished(); timerFinished.schedule(tt,1000); } public static void main(String args[]){ Example e = new Example(); e.openUrl(); } class ListenSysOpenFinished extends TimerTask { @Override public void run(){ timerFinished.cancel(); if(allUrls.size()!=0){ allUrls.remove(0); System.out.println("hello"); timerFinished=new Timer(); ListenSysOpenFinished tt = new ListenSysOpenFinished(); timerFinished.schedule(tt,1000); } } }}其次 这个结果就是4次,timertask结束后,主线程也关闭了。如果实在找不出问题来,看看监听器有没有问题。 你自己写的监听器吧,如果e.getWebBrowser().getLoadingProgress()==100设置一个标记位为false,不要让监听器循环监听了。放在while()里面。 如果有計劃外調用,那就只有在if塊里了:if (e.getWebBrowser().getLoadingProgress() == 100) 檢查下爲什麽會多餘調用,如果狀態到100之後,會再次進入,或者想原因這個監聽方式好不好比如這個listener合不合適,或者想補救辦法,就像30樓,狀態位限制。 发现问题了, 为什么会循环超出正常次数, 是因为e.getWebBrowser().getLoadingProgress(), 这个监听他不光监听浏览器,还监听例如图片,JS文件等等网页所调用的一些元素, 这些也会返回100,所以会循环多次哎,,问题是发现了,,现在不知道如何监听这个网页打开完成100%了。。 郁闷啊。。 呵呵也對 它是泛指loading 好好查一下 應該有網頁對應的監聽的吧 equals问题谁帮我看下 求解Java的一个小问题 小弟想问怎么样用java drawLine把自己的学号和姓名输出到屏幕上? scjp泛型题目,高手进 问个有关image 图象显示的问题 请教高手!(30分) 定义一个矩形类... java与C++在面向对象方面有哪些不同? 怎样从java中导出一个excel文件?? JBuilder4 “父类名 变量=new 子类名对象”的问题,求指教! 关于jbutton[]遍历创建jbutton的点击事件,求大神关注
SwingUtilities.invokeLater(new Runnable() {是不是少个了start啊,
愚见
timerFinished.schedule(new ListenSysOpenFinished(), 2000, 1000);你自己說了是每次,這個是執行一次的還是n次的
還有一個我覺得線程中嵌套線程是不是有點不妥(多餘) invokeLater嵌套在run中,當然這應該不是重點。
這樣子的話可以一步步驗證啊,cancel后先驗證下是不是已經不再執行,諸如此類。
// 在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.
timerFinished.schedule(new ListenSysOpenFinished(), 2000, 1000);
定时触发系统,因为你是一个一个执行的,一个执行完了自己触发另一个。
当你执行到下面这句,又执行一个任务列,尽管你用了cancel
timerFinished.schedule(new ListenSysOpenFinished(), 1000, 2000);
从第一次执行任务到第三个线程执行前,也就是在到执行timerFinished.cancel();这句前,如果时间超过了2秒。那不是又会产生一次任务。
不知道我分析的对不对。建议延时触发一次就好了。然后引发触发链。
// 在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.
timerFinished.schedule(new ListenSysOpenFinished(), 2000, 1000);这句去掉, 然后使用后面的启动任务timerFinished.schedule(new ListenSysOpenFinished(), 1000, 2000);问题是一样的, 我前面其实不是使用TimeTask去执行我的任务, 直接在监听里面递归的 webBrowser.addWebBrowserListener(new WebBrowserAdapter() {
@Override
public void loadingProgressChanged(WebBrowserEvent e) {
if (e.getWebBrowser().getLoadingProgress() == 100) {
JDate jDate = new JDate();
allUrls.remove(0);
oneByOneOpenSys();// 递归直接打开下一个url
}
}
});
但上面的方法为什么不行,,因为去监听(loadingProgressChanged)这个值他是一个并发的执行,我的监听值即使不到100也会继续执行下去,所以我就在里面加了一个TimeTask,目的就是控制必须等到值为100的时候触发下一个任务。。但是都是一样,不知道如何控制,只有监听到这一个值为100就触发下一个任务,或者说递归执行下一个
這個是偽碼,你把執行框架測試成功了我覺得問題就不大了private void openUrl(){
task.scheduleOnce(new ListenSysOpenFinished());//执行一次就好
}public class ListenSysOpenFinished extends TimerTask {
@Override
public void run() {
oneByOneOpenSys();
}
}public void oneByOneOpenSys() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
webBrowser.addWebBrowserListener(new WebBrowserAdapter() {
@Override
public void loadingProgressChanged(WebBrowserEvent e) {
if (e.getWebBrowser().getLoadingProgress() == 100) {
task.scheduleOnce(new ListenSysOpenFinished());
}
}
});
}
}
}
private void openUrl(){
task.scheduleOnce(new ListenSysOpenFinished());//执行一次就好
}public class ListenSysOpenFinished extends TimerTask {
@Override
public void run() {
oneByOneOpenSys();
}
}public void oneByOneOpenSys() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
webBrowser.addWebBrowserListener(new WebBrowserAdapter() {
@Override
public void loadingProgressChanged(WebBrowserEvent e) {
if (e.getWebBrowser().getLoadingProgress() == 100) {
task.scheduleOnce(new ListenSysOpenFinished());
}
}
});
}
}
}
// delay 为long类型:从现在起过delay毫秒执行一次 直接这样行吗?
就是循环的次数总是大于需要循环的次数。
webBrowser.addWebBrowserListener(new WebBrowserAdapter() {
@Override
public void loadingProgressChanged(WebBrowserEvent e) {
if (e.getWebBrowser().getLoadingProgress() == 100) {
JDate jDate = new JDate();
allUrls.remove(0);
oneByOneOpenSys();// 直接调用一下
}
}
});
public class Example {
private Timer timerFinished = null; //你这里是new timer;发现下面就new了一次,结果导致主线程不关闭,还纳闷中
private List<Integer> allUrls = new ArrayList<Integer>(Arrays.asList(1,2,3,4));//所有需要打开的url列表
private void openUrl(){
timerFinished = new Timer();
ListenSysOpenFinished tt = new ListenSysOpenFinished();
timerFinished.schedule(tt,1000);
}
public static void main(String args[]){
Example e = new Example();
e.openUrl();
}
class ListenSysOpenFinished extends TimerTask {
@Override
public void run(){
timerFinished.cancel();
if(allUrls.size()!=0){
allUrls.remove(0);
System.out.println("hello");
timerFinished=new Timer();
ListenSysOpenFinished tt = new ListenSysOpenFinished();
timerFinished.schedule(tt,1000);
}
}
}
}
其次 这个结果就是4次,timertask结束后,主线程也关闭了。
如果实在找不出问题来,看看监听器有没有问题。
e.getWebBrowser().getLoadingProgress()==100
设置一个标记位为false,不要让监听器循环监听了。放在while()里面。
檢查下爲什麽會多餘調用,如果狀態到100之後,會再次進入,或者想原因這個監聽方式好不好比如這個listener合不合適,或者想補救辦法,就像30樓,狀態位限制。