程序不等待Timer在继续循环之前完成

时间:2012-03-20 19:13:14

标签: java multithreading time sleep

每当您单击程序上的“开始”按钮时,我都会运行以下代码。我通过评论表示我想要计时器去,问题是,当我做thread.sleep(time)它冻结我的程序!所以,我想知道someoen是否可以简单地在我的代码中添加atimer,以便它运行第一位,等待,然后再根据bumpNum运行它。

代码:

public class startReplyButtonListener implements ActionListener{


        public void actionPerformed(ActionEvent ev){

            int length = textAreaReplyMessage.getText().length();
            int remLen = 400 - length;

            String strHTML = neo.get("http://www.neopets.com/neoboards/topic.phtml?topic=" + txtTopicID.getText());
            /*strHTML = neo.post("/neoboards/process_topic.phtml?", new String[][] {{"boardType", "topic_id", "board_id", "message", "next", "remLen"}, {"reply", txtTopicID.getText(), "4", textAreaReplyMessage.getText() , "1", ((Integer)remLen).toString()}});

            if(strHTML.contains("No topic with ID")){
                txtLog.append("Invalid Topic ID! \n");
            }
            else{
                txtLog.append("Bumped Topic ID " + txtTopicID.getText() + "\n");
            }
            */
            System.out.println(strHTML);
            bumpNum = 5;
            wait = Integer.parseInt(textWait1.getText()) * 1000; //converting to miliseconds

            int i=1;
            do{
                strHTML = neo.post("/neoboards/process_topic.phtml?", new String[][] {{"boardType", "topic_id", "board_id", "message", "next", "remLen"}, {"reply", txtTopicID.getText(), "4", textAreaReplyMessage.getText() , "1", ((Integer)remLen).toString()}});

                txtLog.append("Board Bumped. Waiting "+ ((Integer)(wait/1000)).toString() +" Seconds..." + "\n");

                //ADD TIMER HERE
                i++;



            }while(i <= bumpNum);

        }

        }

我希望实现的目标:

用户表示他们想要“发布”的次数(由bumpNum表示),循环首先发布一次:

strHTML = neo.post("/neoboards/process_topic.phtml?", new String[][] {{"boardType", "topic_id", "board_id", "message", "next", "remLen"}, {"reply", txtTopicID.getText(), "4", textAreaReplyMessage.getText() , "1", ((Integer)remLen).toString()}});

然后: 根据用户输入,它会等待很多秒(txtWait1),然后重复上面的发布代码,直到达到bumpNum。

它会在下面的每个时间点更新txtLog(因此无法冻结程序):

txtLog.append("Board Bumped. Waiting "+ ((Integer)(wait/1000)).toString() +" Seconds..." + "\n");

2 个答案:

答案 0 :(得分:2)

修改

叹息。好的,现在我明白了。我不知道答案。您正在谈论绘制GUI元素。我怀疑你想分叉一个线程做一个工作,然后显示你正在等待它的GUI显示。您需要等待线程完成(请参阅下面的join代码),一直有GUI元素刷新,当它显示一些结果时,它会完成。

这更多地取决于GUI代码而不是睡眠/计时器。我现在开始一个新问题并解释!!!不要带代码!但是从1000英尺的伪代码查看你想要的。类似的东西:

  

我正在尝试在[Swing / Android / etc]中分叉运行在后台的线程。我想向用户显示线程已经分叉,我希望用户界面等待线程而不冻结,然后我希望用户界面join与线程一起显示结果。

想想我们必须考虑的问题。预计我们会问的问题。弄清楚我们没有,也无法了解你的环境。

祝你好运。

修改

如果你只是试图调用sleep,那么你不需要为此分叉一个线程。您需要在代码中执行的操作是:

  try {
      Thread.sleep(waitingTime);
      System.out.println(waitingTime);
  } catch (InterruptedException e) {
      Thread.currentThread().interrupt();
      e.printStackTrace();
  }

这将暂停当前线程(可能是主线程)waitTime毫秒。


所以你很快就要求3个线程,我想你不想这样做。如果您正在尝试等待每个线程完成,那么您将不得不执行以下操作:

 Thread thread = new Thread(new Counter(wait));
 thread.start();
 thread.join();

其他几条评论:

  • 在类的构造函数中启动线程被认为是错误的形式:new Thread(this).start();
  • 您正在Runnable中创建2个线程对象。您应该只在Runnable创建一个。见上文。

    Thread myCounter = new Thread(this);  << #1
    public Counter(int waitingTime) {
       new Thread(this).start();          << #2
    }
    
  • 在构造函数中定义初始化时,我不会初始化waitingTime = 0;。这令人困惑。删除= 0

        int waitingTime;                    << remove the =0 here
        public Counter(int waitingTime) {
           this.waitingTime = waitingTime;
    
  • 当您抓住InterruptedException时,请务必正确处理。一个好的模式是重置中断标志和/或退出线程:

    } catch (InterruptedException e) {
        // resets the interrupt flag cleared by catching the exception
        Thread.currentThread.interrupt();
        // or stops the thread immediately
        return;
    }
    

答案 1 :(得分:0)

每次循环都会启动一个新线程。不是在构造函数中创建新线程,而是将do/while循环移动到普通方法而不是新线程的run方法。你正在做的是产生一个实际上正在睡眠的新线程,但它不是正在执行循环的线程,所以线程只是继续正常。