Java Sleep无法循环工作[关闭]

Posted

技术标签:

【中文标题】Java Sleep无法循环工作[关闭]【英文标题】:Java Sleep not working in loop [closed] 【发布时间】:2013-09-28 01:30:17 【问题描述】:

我想在我的 java 程序中做的是,当我按下按钮时,它会每隔一段时间在 textfield 中显示文本。 即我按下按钮然后弹出jFrame 并且有一个标签显示如下文本: 第 1 秒:“第 1 秒” 然后是 1 秒的时间延迟 然后是第二件事:“2nd”

我是新手,我尝试用谷歌搜索这个问题,但即使在 3-4 小时后我也找不到解决方案 我尝试了很多东西:sleep,try n catch...

请把答案写得很简单。

这是我的代码: 在下面的代码中,当按下按钮时,jFrame 来了,但里面有一个白屏,当求和结束时,它的屏幕变灰并显示答案....

   private void jButton5ActionPerformed(java.awt.event.ActionEvent evt)                                          
    See.setVisible(true);//See is the JFrame   
    t007.setVisible(true);//Label in See
    l2.setVisible(true);//TextField in See
    int ran, g, d, col, ran2;
    double y = 1000 * (Double.parseDouble(t2.getText()));
    int x = (int) y;
    d = 0;
    double c = Math.pow(10, Integer.parseInt(t1.getText()));
    col = Integer.parseInt(t3.getText());
    for (g = 0; g < col;) 
        ran = (int) (Math.random() * (c)); // Random Number Creation Starts
        if (ran > (c / 10)) 
            g = g + 1;
            ran2 = ((int) (Math.random() * 10)) % 2;
            if (ran2 == 1) 
                ran = ran * (-1);
            
            d = d + ran;
            if (d < 0) 
                ran = ran * (-1);
                d = d + (2 * ran);
            
            l2.setVisible(true);
            t007.setText("" + ran);
            System.out.println("" + ran);
            jButton6.doClick();
            //Pausing (Sleep)
            try 
                  Thread.sleep(x);

              catch (InterruptedException ex) 
            Thread.currentThread().interrupt();
            
            
            
             l2.setText("" + d);
                                                       

【问题讨论】:

使用SwingWorker 提供后台处理和同步以返回事件队列。更多详情请见Concurrency in Swing 不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 将“冻结”。而不是调用Thread.sleep(n) 实现一个Swing Timer 用于重复任务或SwingWorker 用于长时间运行的任务。有关详细信息,请参阅Concurrency in Swing。 嘿,伙计们,我听不懂你们,你们能不能简单点,写下代码,然后告诉我什么和如何。请 @DakshShah 先付钱给我们 ;) 【参考方案1】:

Swing 是一个单线程框架,也就是说,对 UI 的所有交互和修改都应该在 Event Dispatching Thread 的上下文中发生。

EDT 负责处理重绘请求等。

任何阻止 EDT 运行的东西(例如 Thread.sleep 和长时间循环)都会阻止它处理事件,实际上“挂起”你的应用程序直到它变得畅通...

现在,我试图破译你的程序试图做什么......但失败了,所以相反......我做了一个漂亮的计数器......

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TickOver 

    public static void main(String[] args) 
        new TickOver();
    

    public TickOver() 
        EventQueue.invokeLater(new Runnable() 
            @Override
            public void run() 
                try 
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                 catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) 
                

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            
        );
    

    public class TestPane extends JPanel 

        private JTextField field;
        private JButton button;
        private int tick; 
        private Timer timer;

        public TestPane() 

            field = new JTextField(10);
            field.setEditable(false);
            button = new JButton("Start");
            button.addActionListener(new ActionListener() 
                @Override
                public void actionPerformed(ActionEvent e) 
                    button.setEnabled(false);
                    tick = 0;
                    timer.start();
                
            );

            timer = new Timer(1000, new ActionListener() 
                @Override
                public void actionPerformed(ActionEvent e) 
                    field.setText(Integer.toString(++tick));
                    if (tick > 4) 
                        timer.stop();
                        button.setEnabled(true);
                    
                
            );
            timer.setInitialDelay(0);

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            add(field, gbc);
            add(button, gbc);

        
    

请仔细查看Concurrency in Swing 了解更多详情...

【讨论】:

嗨,我想要这个东西,但我不知道如何在我的程序中添加它 我不知道如何创建一个类以及main是做什么的 在我的代码 main 中自动有一些代码,我不知道如何将这些代码放入其中;如何创建所有类 请帮忙,@madprogrammer 先仔细看看this,其实看完整个教程对你会有用的。【参考方案2】:

您应该永远不要在 UI 线程中睡觉,因为它会使 UI 滞后。好像这个过程需要时间才能完成,UI 会卡住,用户体验会受到影响。

使用其他机制,例如 TimerSwingWorker

Concurrency in Swing

【讨论】:

@DakshShah cmets 已经包含帮助您入门的链接。阅读这些内容并询问您是否仍有问题。我也会添加那个链接。 什么是线程,什么是UI,如何在我的程序中集成定时器或swing worker【参考方案3】:

休眠用户界面线程是非常糟糕的做法。 (因为这会导致应用程序变得无响应。)您应该将所有这些代码放在 Runnable 实例的 Run() 方法中:

java.awt.EventQueue.invokeLater(new Runnable() 
            public void run() 
                // Your code here.
            
        );

【讨论】:

如果他睡在 runnable 中它不会有任何影响,你也可以在 EDT 上运行它... 我应该把这一切放在哪里,因为我告诉过你我完全是一个新手 我使用 netbeans,我只是在按钮上编码,但不是这样,请如何解释 A SwingWorker 将是一个更合适的解决方案,因为它提供了将更新重新同步回 EDT 的便捷方法 - 恕我直言【参考方案4】:

问题在于您在事件调度线程上运行了长时间运行的循环。但这是必须调度应用程序的所有事件(如鼠标或键盘事件)的线程,但也会重新绘制事件,导致您的用户界面在每次“脏”时都被重新绘制。这意味着,当您的 for 循环运行时,不会重新绘制用户界面,也不会处理任何其他事件。您的用户界面冻结! 您的 jButton5ActionPerformed 方法应尽快返回,以便事件调度线程可以处理其他事件。您的长时间运行的操作应该由后台的单独线程运行。

以下关于 Swing 并发性的教程是一个很好的起点: http://docs.oracle.com/javase/tutorial/uiswing/concurrency/

也许您可以使用 SwingWorker 类来执行您的后台工作: http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html

【讨论】:

以上是关于Java Sleep无法循环工作[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

无法理解循环中的“继续”功能是如何工作的? [关闭]

while 循环中的 Thread.sleep() 不能正常工作?

Thread.sleep() 不工作。被跳过的操作

无法使循环正常工作

java工作复习——4大时间等待——强制等待(Thread.sleep(5000);)

Java while循环查询[关闭]