当前位置: 首页 > 面试题库 >

actionPerformed方法内部的线程睡眠

厍光霁
2023-03-14
问题内容

首先,我想说的是,我知道这个方法是错误的,因此,我出于好奇而问这个问题。可以说我有一个这样的秋千应用程序:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ThreadSleeping {
    JFrame frame = new JFrame();
    JPanel panel = new JPanel();
    JButton button = new JButton("Load");
    JLabel label = new JLabel();

    public ThreadSleeping() {
        panel.add(button);

        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                label.setIcon(new ImageIcon(
                        "C:/Users/Public/Pictures/Sample Pictures/Tulips.jpg"));
                System.out.println("Tulips painted");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                label.setIcon(new ImageIcon(
                        "C:/Users/Public/Pictures/Sample Pictures/Koala.jpg"));
                System.out.println("Koala painted");

            }
        });

        frame.add(panel, BorderLayout.NORTH);
        frame.add(label, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setSize(1024, 768);
        // frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ThreadSleeping();
            }
        });
    }
}

基本上,当我单击Load按钮时,我期望Tulips.jpg图像显示,然后GUI冻结2秒钟,然后我期望Koala.jpg图像显示。但是发生的是:我单击按钮,GUI冻结2秒钟并Koala.jpg显示。没有Tulips.jpg之前。但是让我感到困惑的是当我把它们System.out.println("Tulips painted");System.out.println("Koala painted");。因此,当我单击按钮时,它会打印“郁金香画”,并在2秒钟后打印“考拉画”。有人可以告诉我这是怎么回事吗?问候。


问题答案:
  1. 在这种情况下可以工作,因为您以编程方式冻结了Swing GUI,但是没有/没有其他更新,也没有 其他JComponent

  2. 在Swing GUI上还有其他一些更新(Thread.sleep(int)冻结事件调度线程)的情况下,该方法不起作用

  3. 默认情况下,JComponents XxxModels永不更新的所有更新将在JComponents view

  4. 直到睡眠结束,您将丢失所有更新到GUI的示例



 类似资料:
  • 我使用 C 和 POSIX 线程创建了一个多线程应用程序。我现在应该阻塞一个线程(主线程),直到设置了布尔标志(变为真)。 我找到了两种方法来完成这件事。 > 在没有睡眠的情况下旋转。 在睡眠中旋转循环。 如果我应该遵循第一种方式,为什么有些人编写代码遵循第二种方式?如果应该使用第二种方法,为什么要让当前线程Hibernate呢?这种方式的缺点是什么?

  • 脚本: 一群汽车从北向南(viceversa)沿着一条双车道道路行驶。过了一会儿,他们到达了一座桥。这座桥是单向的,通行能力有限。一辆汽车花100毫秒通过这座桥。不允许发生交通碰撞。 假设我需要计算,对于所有的车, 从车辆请求进入桥梁到开始穿越之间的时间。 例如:如果一辆向北行驶的汽车到达桥上,发现桥上有汽车向南行驶,它必须等待。它需要等多久?当然,如果只有一辆车(桥是空的),汽车的等待时间=0。

  • 我是一个初学者,我试图重现一个rae条件,以便使自己熟悉这个问题。为此,我创建了以下程序: 我在线程的函数中添加了睡眠,以便重现竞争条件,因为,我是如何理解的,如果我只是添加一个作为工作负载,竞争条件不会表现出来:创建了一个线程,然后它运行工作负载,并且它恰好在另一个迭代中创建的另一个线程开始其工作负载之前完成。我的问题是工作负载中的睡眠()似乎被忽略了。我将参数设置为5sec,我希望程序至少运行

  • 从逻辑上讲,调用< code>wait方法的线程应该已经获得了正在调用< code>wait的对象的固有锁。 oracle教程中提到“在对象的同步方法中调用< code>wait是获取内部锁的一种简单方法”,这意味着至少还有另一种方法可以获取锁。 我的问题是,为了调用< code>wait,除了在synchronized方法内部调用< code>wait之外,还有其他方法可以获取内部锁吗?...它

  • 我有一个写文件的方法,它可能有点慢。因此,我这样做是为了避免阻止其他操作: 然而,直到在a之后执行B之后,仍然需要一段时间,我想知道是否应该这样做: 或者,换句话说,调用一个内部有线程的方法是否意味着等待该方法结束,从而等待线程结束? 只是为了澄清一些事情:我想知道两个选项是否相同,或者在第一个选项中,线程是否应该完成以启动B指令。

  • 我正在研究计算机硬件,在那里我们了解到使用硬件计时器比软件延迟获得更准确的结果。我已经在汇编中编写了1毫秒的软件延迟,我可以启动一个进程,使用这个延迟每毫秒重复一次,并使用计数器每100毫秒做一些其他事情,这种技术不如使用我现在要使用的硬件内置的硬件计时器准确。 所以我想知道Java内置的计时有多精确?我们有< code > system . current time millis 和< code