每当您单击程序上的“开始”按钮时,我都会运行以下代码。我通过评论表示我想要计时器去,问题是,当我做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");
答案 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方法。你正在做的是产生一个实际上正在睡眠的新线程,但它不是正在执行循环的线程,所以线程只是继续正常。