Thread.sleep() 到摇摆定时器转换

Posted

技术标签:

【中文标题】Thread.sleep() 到摇摆定时器转换【英文标题】:Thread.sleep() to swing Timer conversion 【发布时间】:2014-08-30 19:21:16 【问题描述】:

我正在尝试实现Thread.sleep(6000) 行,但它似乎在小程序中冻结。当我尝试使用 Timers 时,我不确定如何使用,因为我对事件监听器不是很好。在用户单击输入按钮后,我基本上试图每 6 秒调用一次方法 fetchUrl()。我该如何实现?

public void init() 

    c = getContentPane();
    c.setLayout(flow);
    c.setBackground(forum); 

    question.setForeground(Color.white);
    question.setFont(tnr);  
    question2.setForeground(Color.white);
    question2.setFont(tnr);
    result.setForeground(Color.white);
    result.setFont(tnr);    
    resp.setBorder(BorderFactory.createBevelBorder(0));
    timeLength.setBorder(BorderFactory.createBevelBorder(0));
    c.add(question);    
    c.add(resp);
    c.add(question2);
    c.add(timeLength);
    c.add(enter);
    c.add(result);
    resp.requestFocus();
    enter.addActionListener(this);
    t = new Timer(DELAY, this);
    t.setInitialDelay(DELAY);



public void actionPerformed(ActionEvent e) 
    final String n1;
    int timeMin, timeSec, count = 0, maxCount;
    timeMin = Integer.parseInt(timeLength.getText());
    timeSec = timeMin * 60;
    maxCount = (int)(timeSec/6);
    if (e.getSource() == enter)          //user clicks enter
        n1 = resp.getText();
        while (count < maxCount) 
            fetchUrl(n1);                 //this method called every 6 seconds
            t.start();
            count++;
        

    

【问题讨论】:

【参考方案1】:

首先,我将首先将ActionListenerTimerJButton 分开。

其次,计时器在逻辑上没有发生任何事情,因为您正在使用按钮源检查来吞下它。

第三,您应该了解计时器的工作原理。基本上对于每个 "tick"(在您的情况下为六秒),都会调用计时器 ActionListener 的 actionPerformed。因此,如果您希望调用 fetch() 方法,那么这就是您应该在 Timer 的 actionPerformed 中可见/可访问的内容。

按钮的ActionListener 应该只处理我相信的计时器的启动。因此,只需将侦听器分开即可。给每个人一个匿名的ActionListener,不需要让类实现ActionListener

例如

timer = new Timer(DELAY, new ActionListener()
    public void actionPerformed(ActionEvent e) 
        // do some stuff every six seconds
        fetchURL();
    
);

enter = new JButton(...);
enter.addActionListener(new ActionListener()
    public void actionPerformed(ActionEvent e) 
        timer.start();
    
);

如果你想要一些定时器的自动停止功能,你可以这样做

timer = new Timer(DELAY, new ActionListener()
    public void actionPerformed(ActionEvent e) 
        if (someStoppingCondition()) 
            timer.stop();
         else 
            // do some stuff every six seconds
            fetchURL();
        
        // do some stuff every six second
    
);

【讨论】:

谢谢,我明白你说的吸收源的按钮的意思了。它奏效了【参考方案2】:

你需要在用户每6秒点击一次按钮后调用一个方法,但你没有说你想调用多少次。

尝试无数次,如下所示,

while(true)

     new Thread()
          @Override
          public void run()
                try
                       Thread.sleep(6000);
                       fetchUrl(n1);
                catch(InterruptedException e)
          

     .start();


如果您将在您的小程序中使用 Thread.sleep(),那么您的小程序将被挂起 6 秒,因此为它创建一个新线程。

【讨论】:

以上是关于Thread.sleep() 到摇摆定时器转换的主要内容,如果未能解决你的问题,请参考以下文章

c#中怎样建立定时器?用以替代thread.sleep(),克服sleep延时不精确的问题。

Java -- 定时任务实现方式

多线程&定时器Timer&同步&线程通信&ThreadLocal

定时器计划如何工作?

定时任务--单点系统

TimerTask vs Thread.sleep vs Handler postDelayed - 每N毫秒调用一次函数最准确?