本帖最后由 tcmis 于 2012-04-11 14:55:35 编辑

解决方案 »

  1.   


     SwingUtilities.invokeLater(new Runnable() {是不是少个了start啊,
    愚见
      

  2.   

    // 在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.
    timerFinished.schedule(new ListenSysOpenFinished(), 2000, 1000);你自己說了是每次,這個是執行一次的還是n次的
    還有一個我覺得線程中嵌套線程是不是有點不妥(多餘) invokeLater嵌套在run中,當然這應該不是重點。
      

  3.   

    invokeLater()延迟唤醒线程,哦
      

  4.   

    oh,sorry, 你有個cancel
    這樣子的話可以一步步驗證啊,cancel后先驗證下是不是已經不再執行,諸如此類。
      

  5.   

    cancel能不能完全的取消掉。。
      

  6.   

    楼主好像没必要用 
    // 在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.
    timerFinished.schedule(new ListenSysOpenFinished(), 2000, 1000);
    定时触发系统,因为你是一个一个执行的,一个执行完了自己触发另一个。
    当你执行到下面这句,又执行一个任务列,尽管你用了cancel
    timerFinished.schedule(new ListenSysOpenFinished(), 1000, 2000);
    从第一次执行任务到第三个线程执行前,也就是在到执行timerFinished.cancel();这句前,如果时间超过了2秒。那不是又会产生一次任务。
    不知道我分析的对不对。建议延时触发一次就好了。然后引发触发链。
      

  7.   

    楼上的兄弟分析的有道理, 问题是现在我即使把   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.   

    所以现在的问题就是我需要打开的链接列表是8个(allUrls.size()), 那么有可能循环超过8次。具体的原因我想是我的监听这个地方存在问题, 没有监听到100,也往下面执行了。不知道为什么为出现这样一种情况。
      

  9.   

    就像8樓說的,你貌似還是沒有用只執行一次的schedule重載方法啊
      

  10.   


    這個是偽碼,你把執行框架測試成功了我覺得問題就不大了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());
                                    }
                                }
                });
            }
        }
      

  11.   


    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());
                        }
                    }
                });
            }
        }

      

  12.   

    楼上的兄弟, 需要重载吗?timer.schedule(task, delay)
    // delay 为long类型:从现在起过delay毫秒执行一次 直接这样行吗?
      

  13.   

    http://www.cnblogs.com/soarwell/archive/2009/03/18/1415206.html
      

  14.   

    老大, 那个我早就试过了, 问题是一样的, allUrls.size() 如果等于8,,肯定是循环大于8次, 
    就是循环的次数总是大于需要循环的次数。
      

  15.   

    照道理这个程序不需要使用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();// 直接调用一下
                                    }
                                }
                            });
      

  16.   

    都簡化成這樣了,還有問題?那你意思是會有oneByOneOpenSys()方法莫名的計劃外被調用?不好調試就用打印啊,觀察對象就那麼一個。
      

  17.   


    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结束后,主线程也关闭了。
    如果实在找不出问题来,看看监听器有没有问题。
      

  18.   

    你自己写的监听器吧,如果
    e.getWebBrowser().getLoadingProgress()==100
    设置一个标记位为false,不要让监听器循环监听了。放在while()里面。
      

  19.   

    如果有計劃外調用,那就只有在if塊里了:if (e.getWebBrowser().getLoadingProgress() == 100) 
    檢查下爲什麽會多餘調用,如果狀態到100之後,會再次進入,或者想原因這個監聽方式好不好比如這個listener合不合適,或者想補救辦法,就像30樓,狀態位限制。
      

  20.   

    发现问题了, 为什么会循环超出正常次数, 是因为e.getWebBrowser().getLoadingProgress(), 这个监听他不光监听浏览器,还监听例如图片,JS文件等等网页所调用的一些元素, 这些也会返回100,所以会循环多次哎,,问题是发现了,,现在不知道如何监听这个网页打开完成100%了。。 郁闷啊。。
      

  21.   

    呵呵也對 它是泛指loading 好好查一下 應該有網頁對應的監聽的吧