JavaFX计时器线程问题
我一直在尝试使用JavaFX和scenebuilder创建计时器,但是在创建线程时遇到了一些问题。每当我点击开始按钮时,应用程序就会落后,并且永远不会真正更新文本。我一直在尝试使用JavaFX计时器线程问题,java,multithreading,javafx,Java,Multithreading,Javafx,我一直在尝试使用JavaFX和scenebuilder创建计时器,但是在创建线程时遇到了一些问题。每当我点击开始按钮时,应用程序就会落后,并且永远不会真正更新文本。我一直在尝试使用Platform.runLater(),但如上所述,一切都落后了,结果是 以下是控制计时器的方法,链接到FXML文件上的特定按钮: @FXML private void startTimer(){ System.out.println("started"); stopWatch.startTim
Platform.runLater()
,但如上所述,一切都落后了,结果是
以下是控制计时器的方法,链接到FXML文件上的特定按钮:
@FXML
private void startTimer(){
System.out.println("started");
stopWatch.startTimer();
}
@FXML
private void pauseTimer(){
stopWatch.pauseTimer();
}
@FXML
private void stopTimer(){
System.out.println("stopped");
stopWatch.stopTimer();
}
@FXML
public void updateTimer(long dT){
//System.out.println(((dT/6000)%1000)+":"+String.valueOf((dT/1000)%1000)+","+String.valueOf((dT)%1000));
Platform.runLater(() ->{
timer.setText(String.valueOf(dT/1000) );
});
}
下面是StopWatch.java类:
package sled.timer.address.model;
import sled.timer.address.view.PersonOverviewController;
public class StopWatch implements Runnable{
private Thread runThread;
public boolean running = false;
public boolean paused = false;
private long summedTime = 0;
PersonOverviewController personOverviewController;
String time = "";
public void count(){
}
public StopWatch(PersonOverviewController personOverviewController){
this.personOverviewController = personOverviewController;
}
public void startTimer(){
running = true;
paused = false;
runThread = new Thread(this);
runThread.start();
}
public void pauseTimer(){
paused = true;
}
public void stopTimer(){
running = false;
paused = false;
}
@Override
public void run() {
// TODO Auto-generated method stub
long startTime = System.currentTimeMillis();
while(running && !paused){
personOverviewController.updateTimer(summedTime + (System.currentTimeMillis() - startTime));
}
if(paused)
summedTime += System.currentTimeMillis() - startTime;
else
summedTime = 0;
}
public long getSummedTime(){
return summedTime;
}
感谢您的帮助 您不限制线程的更新频率。通过这种方式,您为应用程序线程发布了太多可运行的,几乎没有时间进行事件处理和布局,从而使您的应用程序以这种方式运行 此外,您不同步对布尔标志的访问,也不使它们成为易变的,这意味着值更改不一定对其他线程可见 相反,您应该确保在最后一次
Runnable
启动之前不会发布更多更新:
private final Object updaterLock = new Object();
private final boolean updating = false;
private final long value;
public void updateTimer(long dT) {
synchronized (updaterLock) {
value = dT;
if (!updating) {
updating = true;
Platform.runLater(() -> {
synchronized (updaterLock) {
updating = false;
timer.setText(Long.toString(value/1000));
}
});
}
}
}
但是考虑使用来做更新。此类的更新频率是有限的。
您不限制线程的更新频率。通过这种方式,您为应用程序线程发布了太多可运行的,几乎没有时间进行事件处理和布局,从而使您的应用程序以这种方式运行 此外,您不同步对布尔标志的访问,也不使它们成为易变的,这意味着值更改不一定对其他线程可见 相反,您应该确保在最后一次Runnable
启动之前不会发布更多更新:
private final Object updaterLock = new Object();
private final boolean updating = false;
private final long value;
public void updateTimer(long dT) {
synchronized (updaterLock) {
value = dT;
if (!updating) {
updating = true;
Platform.runLater(() -> {
synchronized (updaterLock) {
updating = false;
timer.setText(Long.toString(value/1000));
}
});
}
}
}
但是考虑使用来做更新。此类的更新频率有限