在Java中使用Swing GUI中的线程

时间:2012-07-01 08:35:04

标签: java multithreading swing

我使用以下代码,用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();

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

5 个答案:

答案 0 :(得分:7)

  

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

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

  

有没有其他方法可以做这些愚蠢的事情?

如果您按固定的时间间隔更新标签,那么您可能应该使用Timer来代替

旁注:

  • 在进行多线程处理时应避免使用while(true),您应该定义在循环中测试的停止布尔值,或者如果扩展Thread.interrupted()
  • 则使用Thread
  • 从非EDT线程更新UI元素时,应使用SwingUtilities.invokeLater

答案 1 :(得分:4)

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

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

无需重新发明轮子。

Timer tutorial

修改

对车轮改造部分进行了一些跟进。您还应该考虑Andrew Thompson的建议。 Swing中有一些组件专门用于指示进度。正如您所想做的那样,使用标签进行此操作是不必要的。看看JProgressBar。它会变得简单,看起来更专业。

答案 2 :(得分:4)

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

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

使用您的方法,您只需创建无限循环。

注意:请查看Java Timer。它非常有用和高效。

答案 3 :(得分:4)

此代码存在几个问题。

  1. 应在事件调度线程上访问/更新Swing组件,这些组件不是线程安全的。因此,启动另一个线程来更新JLabel根本就没有完成。有关详细信息,请参阅'Concurrency in Swing'教程
  2. 即使你在EDT上调用上面的代码,你也不会看到JLabel的任何更新,因为Thread.sleep会阻止EDT,并避免重新绘制。
  3. 所以解决方案是使用javax.swing.Timer类,它允许定期在EDT上执行操作,并且不会阻止它们之间的EDT。另请参阅Timer tutorial。作为副作用,使用定时器可以避免永远不会结束的while(true)循环。

    您可以找到更完整的答案here

答案 4 :(得分:3)

试试这个,

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

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

  3. 保持非ui线程处理事件调度程序线程,否则您将使GUI挂起 你的线程已经完成了run()方法。在你的情况下,它是无限的,同时(真实)。

  4. 如果你想同步 非ui work和ui work ,那么你可以使用 Handler或Swing-Worker。

  5. 最后但并非最不重要,请查看 TimeTask ,请参阅此链接

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