3

我正在使用以下代码,JLabel每 0.5 秒替换一次,用相同的句子但用另一个点。

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

这是使用线程的真正目的吗?这会影响程序的速度吗?如果我正在做的事情如此愚蠢,还有其他方法可以做如此愚蠢的事情吗?

4

5 回答 5

7

这是使用线程的真正目的吗?

如果您希望这些操作并行运行,那么答案是肯定的

还有其他方法可以做这种愚蠢的事情吗?

如果您以固定的时间间隔更新标签,那么您可能应该改用Timer s

附带说明:

  • 您应该避免while(true)在执行多线程时使用,您应该定义一个在循环中测试的停止布尔值,或者Thread.interrupted()在扩展Thread类时使用
  • 从非 EDT 线程更新 UI 元素时,您应该使用SwingUtilities.invokeLater
于 2012-07-01T08:54:41.220 回答
4

尝试使用Timer来自 Swing 库的代替。将这些用于与 GUI 相关的任务通常是一个更好的主意。当您尝试在多个组件上使用定时事件时,这将特别派上用场,因为所有计时器共享相同的计时器线程。

它还提供了基于监听器的灵活直观的编程模型。

无需重新发明轮子。

定时器教程

编辑:

对车轮改造部分的一点跟进。您还应该考虑 Andrew Thompson 的建议。Swing 中有一些组件是专门为指示进度而设计的。正如您尝试做的那样,没有必要使用标签来做到这一点。看看JProgressBar。它会很简单,看起来会更专业。

于 2012-07-01T08:43:51.567 回答
4

第一个建议,而不是使用这样的东西:

while(!isStopped) {
  // do some work
}

通过您的方法,您刚刚创建了无限循环。

注意:看看Java Timer。这是非常有用和高效的。

于 2012-07-01T08:46:05.580 回答
4

这段代码有几个问题。

  1. Swing 组件应在 Event Dispatch Thread 上访问/更新,并且不是线程安全的。所以启动另一个线程来更新你JLabel的根本就没有完成。有关更多信息,请参阅“Swing 中的并发”教程
  2. 即使您在 EDT 上调用上面的代码,您也不会看到任何更新,JLabel因为这Thread.sleep会阻塞 EDT,并避免重绘。

所以解决方案是使用javax.swing.Timer类,它允许定期对 EDT 执行操作,并且不会在其间阻塞 EDT。另请参阅Timer教程。作为副作用,使用计时器可以避免while(true)永远不会结束的循环。

您可以在此处找到更完整的答案。

于 2012-07-01T10:49:58.603 回答
3

试试这个,

  1. 如果您的目的是并行处理,您将需要上述方法。

  2. 你已经给出了while (true),这将导致一个无限循环,你必须控制它,最好有一个布尔变量来控制数字。while 循环的迭代。

  3. 让您的非 UI 线程处理 OUT 的 Event Dispatcher Thread,否则您将使 GUI 挂起,直到您的线程完成其 run() 方法。在您的情况下,它是无限的,如 while (true)。

  4. 如果要同步ui 工作和 ui 工作,则可以使用Handler 或 Swing-Worker。

  5. 最后但并非最不重要的一点,看看TimeTask,看这个链接

    http://enos.itcollege.ee/~jpoial/docs/tutorial/essential/threads/timer.html

于 2012-07-01T09:47:24.843 回答