gpt4 book ai didi

java - Thread.sleep 是如何工作的?

转载 作者:行者123 更新时间:2023-11-29 06:38:52 30 4
gpt4 key购买 nike

我制作了一个程序,可以不时地设置按钮的 setEnableThread.sleep() 在另一个类中。这是代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Try extends JFrame implements ActionListener{
JButton n1 = new JButton("1");
JButton n2 = new JButton("2");
JButton n3 = new JButton("3");
JButton show = new JButton("Show");

{
show.addActionListener(this);
n1.setEnabled(false);
n2.setEnabled(false);
n3.setEnabled(false);

}

public Try(){
super("Try");
setVisible(true);
setSize(500, 200);
setLayout(new GridLayout(1, 4));
add(n1);
add(n2);
add(n3);
add(show);
}

public void actionPerformed(ActionEvent a) {
Object clicked = a.getSource();
if(show == clicked){
new EasyLevel1().start();
}
}

class EasyLevel1 extends Thread {
public void run() {
try {
n1.setEnabled(true);
Thread.sleep(1000);
n1.setEnabled(false);
n2.setEnabled(true);
Thread.sleep(1000);
n2.setEnabled(false);
n3.setEnabled(true);
Thread.sleep(1000);
n3.setEnabled(false);
} catch (InterruptedException e){
}
}
}

public static void main(String[] args){
Try frame = new Try();
frame.setVisible(true);
}
}

但是,当我将它放在类中的 actionListener 上时:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Try extends JFrame implements ActionListener{
JButton n1 = new JButton("1");
JButton n2 = new JButton("2");
JButton n3 = new JButton("3");
JButton show = new JButton("Show");

{
show.addActionListener(this);
n1.setEnabled(false);
n2.setEnabled(false);
n3.setEnabled(false);

}

public Try(){
super("Try");
setVisible(true);
setSize(500, 200);
setLayout(new GridLayout(1, 4));
add(n1);
add(n2);
add(n3);
add(show);
}

public void actionPerformed(ActionEvent a) {
Object clicked = a.getSource();
if(show == clicked){
try {n1.setEnabled(true);
Thread.sleep(1000);
n1.setEnabled(false);
n2.setEnabled(true);
Thread.sleep(1000);
n2.setEnabled(false);
n3.setEnabled(true);
Thread.sleep(1000);
n3.setEnabled(false);
} catch (InterruptedException e){}
}
}

public static void main(String[] args){
Try frame = new Try();
frame.setVisible(true);
}
}

它卡住了我的整个程序,基于那个例子,我了解到线程 sleep 应该在另一个线程中运行以阻止当前类卡住。但是我希望新的 thread.sleep 仍然卡住它的操作,就像它仍然会执行上面的代码一样,但是按钮会响应,因为它在另一个线程中。但令人惊讶的是它做了我想要它做的事情,它没有像第一个程序那样立即将所有内容设置为禁用。

最佳答案

Thread.sleep() 使当前线程暂停。您在 actionPerformed 中运行它,即在 Swing 事件中。所有 Swing 操作都在单个线程 EDT 中完成。当您使用 Thread.sleep() 暂停它时,Swing 无法处理任何其他事件,因为您尚未从 actionPerformed 监听器返回。因此,GUI 卡住(不是完整的应用程序,只是 GUI)。

因此,一般来说,在 Swing 事件中执行长时间运行的操作是不好的做法。对于您正在尝试做的事情,好的替代方法是使用 Swing 计时器。

关于java - Thread.sleep 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15594098/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com