我使用以下代码,用0.5秒替换JLabel
,用相同的句子替换另一个点。
Runnable r1=new Runnable() {
@Override
public void run() {
while(true){
try {
connectionStatus.setText("Connection Established...");
Thread.sleep(500L);
connectionStatus.setText("Connection Established.");
Thread.sleep(500L);
connectionStatus.setText("Connection Established..");
Thread.sleep(500L);
} catch (InterruptedException ex) {
}
}
}
};
Thread th1=new Thread(r1);
th1.start();
这是使用线程的真正目的吗?这会影响程序的速度吗?如果我正在做的事情是如此愚蠢,还有其他方法来做这些愚蠢的事情吗?
答案 0 :(得分:7)
这是使用线程的真正目的吗?
如果您希望这些操作以并行运行,那么答案是肯定的
有没有其他方法可以做这些愚蠢的事情?
如果您按固定的时间间隔更新标签,那么您可能应该使用Timer来代替
旁注:
while(true)
,您应该定义在循环中测试的停止布尔值,或者如果扩展Thread.interrupted()
类Thread
SwingUtilities.invokeLater
答案 1 :(得分:4)
尝试使用Swing库中的Timer
。将这些用于GUI相关任务通常是更好的主意。当您尝试在多个组件上使用定时事件时,这将特别派上用场,因为所有计时器共享相同的计时器线程。
它还提供基于听众的灵活直观的编程模型。
无需重新发明轮子。
修改强> 的
对车轮改造部分进行了一些跟进。您还应该考虑Andrew Thompson的建议。 Swing中有一些组件专门用于指示进度。正如您所想做的那样,使用标签进行此操作是不必要的。看看JProgressBar
。它会变得简单,看起来更专业。
答案 2 :(得分:4)
第一个建议,而不是使用这样的东西:
while(!isStopped) {
// do some work
}
使用您的方法,您只需创建无限循环。
注意:请查看Java Timer。它非常有用和高效。
答案 3 :(得分:4)
此代码存在几个问题。
JLabel
根本就没有完成。有关详细信息,请参阅'Concurrency in Swing'教程JLabel
的任何更新,因为Thread.sleep
会阻止EDT,并避免重新绘制。所以解决方案是使用javax.swing.Timer
类,它允许定期在EDT上执行操作,并且不会阻止它们之间的EDT。另请参阅Timer
tutorial。作为副作用,使用定时器可以避免永远不会结束的while(true)
循环。
您可以找到更完整的答案here。
答案 4 :(得分:3)
试试这个,
如果您的目的是并行处理,则需要采用上述方法。
您已经 while(true),这将导致无限循环,您必须控制它, 最好有一个布尔变量来控制nos。 while循环的迭代。
保持非ui线程处理事件调度程序线程,否则您将使GUI挂起 你的线程已经完成了run()方法。在你的情况下,它是无限的,同时(真实)。
如果你想同步 非ui work和ui work ,那么你可以使用 Handler或Swing-Worker。
最后但并非最不重要,请查看 TimeTask ,请参阅此链接
http://enos.itcollege.ee/~jpoial/docs/tutorial/essential/threads/timer.html