【问题标题】:How do you handle duplicate calls of Java threads?如何处理 Java 线程的重复调用?
【发布时间】:2021-10-29 12:41:46
【问题描述】:
private int limitTime = 10;
void timer() {
    limitTime = 10;
    Thread thread = new Thread() {
        @Override
        public void run() { 
            stop = false;
            while(!stop) {
                System.out.println("Time >> " + limitTime);
                //Platform.runLater(()->{
                    lbLimitTime.setText(Integer.toString(limitTime));
                    limitTime -= 1;
                //});   
                    if(limitTime < 1) stop = true;
                try { Thread.sleep(1000); } catch (InterruptedException e) {}
            }
        };
    };
    thread.setDaemon(true);
    thread.start(); 
}

我们正在使用 JavaFX 创建 GUI 程序。

我尝试为每次点击设置一个 10 秒的计时器。

如果在 10 秒前点击重复计时器功能,时间会快两倍。

你觉得我不明白哪一部分?

每次点击时都会调用计时器函数。

当点击发生时,我想初始化现有的定时器并正常流动1秒。

【问题讨论】:

  • 例如,每次点击按钮时,您是否运行计时器功能?
  • 不要产生不受控制的线程。使用执行器服务
  • 是的,没错。点击后,功能运行10秒后正常运行。

标签: java multithreading timer


【解决方案1】:

对于您的用例而言,使用 Thread 不是一个好主意,请使用 TimerTaskjava.util.Timer

// class wide variables
TimerTask timerTask;
Timer timer = new Timer("myTimer");
int limitTimer = 10;

public TimerTask createTask() {
    limitTimer = 10;
    return new TimerTask() {
        @Override
        public void run() {
            System.out.println("Time>> " + limitTime);
            limitTime--;
            if (limitTime <= 0) {
                cancel();
            }
        }
    }
}

void click() {
   if (timerTask != null) {
      timerTask.cancel();
   }

   timerTask = createTask();
   timer.scheduleAtFixedRate(timerTask, 0, 1000);
}

调用click方法时,会取消旧定时器,开始新定时器。

注意limitTimer 变量不是线程安全的,所以如果你在其他地方更新它,可能会导致奇怪的行为。

【讨论】:

  • 非常感谢。多亏了您,我们轻松解决了它,您将非常幸运。我觉得世界很美好,因为有你这样的人。
  • @이유진,仅供参考,避免new Thread(...) 通常是个好主意。如果您仅在程序启动时执行此操作,并且线程在进程的整个生命周期内一直运行,则可以。但是,如果你认为你想创建一个线程来执行一些简单的、有限的任务(例如,等待十秒钟然后更新一个文本字段),那么几乎总是有更好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 2013-04-29
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多