Java 事件中的事件调度线程

Java 事件中的事件调度线程,java,swing,event-dispatch-thread,Java,Swing,Event Dispatch Thread,出于学习目的,我正在努力运行一个线程而不使用Timer、TimerTask、SwingWorker。来自PHP背景的EDT对我来说是一种新的东西&也很难理解,我需要你理解我的情况 我创建/构造了以下代码,但我想问,这是线程安全的吗?这让我更加困惑,因为我在另一个帖子上问这个问题,他们只是说这是安全的,但很难看。他们只是说这句话,我会认为它是不安全的,因为线程。睡眠来自主线程,那么为什么它是安全的呢 startButton.addActionListener(new ActionListener(

出于学习目的,我正在努力运行一个线程而不使用Timer、TimerTask、SwingWorker。来自PHP背景的EDT对我来说是一种新的东西&也很难理解,我需要你理解我的情况

我创建/构造了以下代码,但我想问,这是线程安全的吗?这让我更加困惑,因为我在另一个帖子上问这个问题,他们只是说这是安全的,但很难看。他们只是说这句话,我会认为它是不安全的,因为线程。睡眠来自主线程,那么为什么它是安全的呢

startButton.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent arg0) {

//========================================================================

       Thread worker = new Thread() {
           public void run() {

            // Simulate doing something useful.
            for(int i=0; i<=10; i++) {

             final int count = i;

             SwingUtilities.invokeLater(new Runnable() {
              public void run() {
               countLabel1.setText(Integer.toString(count));
              }
             });




             try {
              Thread.sleep(1000);
             } catch (InterruptedException e) {}
            } // end loop



            SwingUtilities.invokeLater(new Runnable() {
             public void run() {
              statusLabel.setText("Completed.");
             }
            });

           }
          };

          worker.start();


//==========================================================================       




   }
  });

有点您遇到的问题是SwingUtilles.invokeLater将在将来某个时候调用您的Runnable,这意味着count的值很可能已更改为超出您使用invokeLater时的原始值。您可以使用invokeAndWait,它将等待Runnable被执行,然后再将执行控制返回给调用者……出于学习目的,我正在努力运行一个线程,而不使用Timer、TimerTask、SwingWorker。除非您正在学习“如何使用任意限制的API”,否则我不会打扰您。想想看,学这个也没什么意义。@AndrewThompson,你说得对,不知怎的,我晚上睡不好觉:D,这是相关的,但我想没关系,也许将来我会发现。@MadProgrammer,谢谢,所以它是安全的,因为这个调用器在将来调用Runnable,这对我来说也是有意义的,我会找到更多关于invokeAndWait的信息,所有这些词我也不熟悉D@hansf. 它是线程安全的,因为UI是从UI的单个线程更新的,但是由于更新所依赖的值在调用更新时很可能已经更改,因此引入了竞争条件