您如何处理 Java 线程的重复调用?
How do you handle duplicate calls of Java threads?
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秒
对于您的用例,使用 Thread 不是一个好主意,请使用 TimerTask
和 java.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
变量不是线程安全的,因此如果您在其他地方更新它,可能会导致奇怪的行为。
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秒
对于您的用例,使用 Thread 不是一个好主意,请使用 TimerTask
和 java.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
变量不是线程安全的,因此如果您在其他地方更新它,可能会导致奇怪的行为。