当前位置: 首页 > 知识库问答 >
问题:

Java中的时钟线程

别烨熠
2023-03-14

以下是上述应用程序的代码(包括2个类:Main和ClockPanel)

public class Main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Clock");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(300, 300);
            frame.setLayout(new GridLayout(1, 1));

            ClockPanel clock = new ClockPanel();
            frame.add(clock);

            frame.setVisible(true);
        });
    }
}
public class ClockPanel extends JPanel implements ActionListener {

    private JLabel timeValue;
    private JButton runButton;
    private JButton pauseButton;
    private JButton resetButton;

    private boolean isRunning;
    private int seconds;


    public ClockPanel() {
        timeValue = new JLabel("0");

        setBorder(BorderFactory.createLineBorder(Color.BLACK));
        setAlignmentX(Component.CENTER_ALIGNMENT);
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

        initButtons();

        // create panel to display the clocks
        JPanel timePanel = new JPanel();
        timePanel.setLayout(new BoxLayout(timePanel, BoxLayout.X_AXIS));
        timePanel.setAlignmentX(Component.CENTER_ALIGNMENT);
        JLabel timeLabel = new JLabel("Value");
        timePanel.add(timeLabel);
        timePanel.add(Box.createRigidArea(new Dimension(30, 0)));
        timePanel.add(timeValue);
        add(timePanel);

        add(Box.createRigidArea(new Dimension(0, 20)));

        // create panel to display the buttons
        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS));
        buttonPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
        buttonPanel.add(runButton);
        buttonPanel.add(Box.createRigidArea(new Dimension(30, 0)));
        buttonPanel.add(pauseButton);
        buttonPanel.add(Box.createRigidArea(new Dimension(30, 0)));
        buttonPanel.add(resetButton);
        add(buttonPanel);

        // create thread to run the clock
        Thread clockThread = new Thread(() -> {
            seconds = -1;
            while (true) {
//                System.out.println(); // if this line is removed, the clock will not run
                if (isRunning) {
                    try {
                        seconds++;
                        timeValue.setText(String.valueOf(seconds));
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        clockThread.start();
    }

    private void initButtons() {
        runButton = new JButton("Run");
        pauseButton = new JButton("Pause");
        resetButton = new JButton("Reset");

        runButton.addActionListener(this);
        pauseButton.addActionListener(this);
        resetButton.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == runButton) {
            isRunning = true;

            runButton.setEnabled(false);
            pauseButton.setEnabled(true);
            resetButton.setEnabled(false);
        } else if (e.getSource() == pauseButton) {
            isRunning = false;

            runButton.setEnabled(true);
            pauseButton.setEnabled(false);
            resetButton.setEnabled(true);
        } else if (e.getSource() == resetButton) {
            isRunning = false;
            timeValue.setText("0");
            seconds = 0;

            runButton.setEnabled(true);
            pauseButton.setEnabled(false);
            resetButton.setEnabled(false);
        }
    }
}

问题是:如果我删除该行系统。出来println()(正如我在上面的代码中所评论的那样),时钟将不会运行。我完全不知道为什么会这样。有人能给我解释一下吗?是因为系统。出来println()影响正在运行的线程或其他什么?

共有1个答案

云卓
2023-03-14

isRun不是易失性,因此每个线程看到的值都可能发散。当值为false时,您有一个循环只会旋转,并且没有理由去检查“真实”值是否发生了变化。

注意,您不应该(直接或间接地)在AWT事件调度线程(EDT)之外使用Swing组件。

简单的修复方法是使isRunning变为volatile,并使用EventQueue。invokeLater调用时间值。setText。

最好用javax完全取代clockThread。摆动计时器(而不是java.util.Timer),但这可能没有抓住重点。至少让时钟线程等待运行更改。

 类似资料:
  • 有两种执行指令的机制。 单时钟周期实现 管道 在MIPS体系结构(摘自《计算机组织与设计》一书)中,教学分为5个阶段。 因此,在单时钟周期实现中,这意味着在一个时钟周期内,一条指令执行5个阶段。 例如,加载指令(有5个阶段)在一个时钟周期内执行。因此,在这一个时钟周期之后可以执行其他指令。让我们假设一个时钟周期是10秒。 现在,在流水线中,多条指令可以重叠。与上面示例中的一个时钟周期的时间相比,我

  • 问题内容: 我正在尝试使用摆陀制作秒表,但无法正常工作。这是我的代码。Jlabel时钟始终显示-1,只有在它停止时才发生。我是否正确使用了invokelater? 工作代码 问题答案: 您的课程运行一次,然后终止… 线程将在存在于其方法时终止,在本例中为您的方法。 你需要做的,什么是维持一个循环,直到变成 尽管使用… 会更简单… 然后,您可以从中剥离功能(即)

  • 时钟中断 本章的最后,我们来实现操作系统中极其重要的时钟中断。时钟中断是操作系统能够进行线程调度的基础,操作系统会在每次时钟中断时被唤醒,暂停正在执行的线程,并根据调度算法选择下一个应当运行的线程。 [info] RISC-V 中断寄存器的细分 在前面提到,sie 和 sip 寄存器分别保存不同中断种类的使能和触发记录。例如,软件中断的使能是 sie 中的 SSIE 位,触发记录是 sip 中的

  • 本文向大家介绍纯js+css实现在线时钟,包括了纯js+css实现在线时钟的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了js+css实现在线时钟的具体代码,供大家参考,具体内容如下 实现要点 1、transform-origin的基本点的应用 2、批量处理html和样式的信息 3、指证位置进行了优化(时针与小时和分针位置有关,分针与分和秒针位置有关)。 新增居中方式: 开启绝对定位

  • 问题内容: 我读了这句话: 主线程必须是完成执行的最后一个线程。当主线程停止时,程序终止。 是真的吗 我也知道“即使主线程死程序继续运行”。 据我了解:启动程序时,JVM创建一个线程来运行您的程序。JVM创建一个用于运行程序的用户线程。该线程称为主线程。该类的main方法是从主线程调用的。如果程序从主线程中产生新线程,它将停止直到最后一个线程死亡。 哪一个是对的? 问题答案: 当所有非守护程序线程

  • 问题内容: 我正在制作一个分布式Java应用程序,我需要该应用程序的两个部分都可以在一个标准时间运行。由于系统时间可能不同,我在想Java API是否包含某个类来从标准在线源下载时间? 问题答案: 您需要使用NTP(网络时间协议): http://en.wikipedia.org/wiki/Network_Time_Protocol 以下链接包含一些参考Java NTP客户端代码,用于与NTP服务