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