Javafx 中 'ScheduledService' 的简单示例
Simple example for 'ScheduledService' in Javafx
我是一名学生,学习 JavaFX 已经一个月了。
我正在开发一个应用程序,我希望服务在执行任务后再次启动。为此,我知道使用了“ScheduledService”。
那么任何人都可以用简单的例子解释 scheduledservice 的使用,以及它与 JavaFX 中的 'Service' 有何不同。谢谢 ;)
编辑:如何定义这个名为 DataThread 的 ScheduledService 应该每 5 秒重新启动一次?
public class DataThread extends ScheduledService<Void>
{
@Override
public Task<Void> createTask() {
return new Task<Void>() {
@Override
public Void call() throws Exception {
for(i=0;i<10;i++)
{
System.out.println(""+i);
}
return null;
}
};
}
}
考虑到您对 Service
class. ScheduledService
有充分的了解,这只是一个具有调度功能的服务。
来自文档
The ScheduledService is a Service which will automatically restart itself after a successful execution, and under some conditions will restart even in case of failure
所以我们可以这样说,
Service -> Execute One Task
ScheduledService -> Execute Same Task at regular intervals
定时服务的一个非常简单的例子是TimerService,它计算服务任务被调用的次数。预定每1秒调用一次
import java.util.concurrent.atomic.AtomicInteger;
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.concurrent.ScheduledService;
import javafx.concurrent.Task;
import javafx.concurrent.WorkerStateEvent;
import javafx.event.EventHandler;
import javafx.stage.Stage;
import javafx.util.Duration;
public class TimerServiceApp extends Application {
@Override
public void start(Stage stage) throws Exception {
TimerService service = new TimerService();
AtomicInteger count = new AtomicInteger(0);
service.setCount(count.get());
service.setPeriod(Duration.seconds(1));
service.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
System.out.println("Called : " + t.getSource().getValue()
+ " time(s)");
count.set((int) t.getSource().getValue());
}
});
service.start();
}
public static void main(String[] args) {
launch();
}
private static class TimerService extends ScheduledService<Integer> {
private IntegerProperty count = new SimpleIntegerProperty();
public final void setCount(Integer value) {
count.set(value);
}
public final Integer getCount() {
return count.get();
}
public final IntegerProperty countProperty() {
return count;
}
protected Task<Integer> createTask() {
return new Task<Integer>() {
protected Integer call() {
//Adds 1 to the count
count.set(getCount() + 1);
return getCount();
}
};
}
}
}
我是一名学生,学习 JavaFX 已经一个月了。 我正在开发一个应用程序,我希望服务在执行任务后再次启动。为此,我知道使用了“ScheduledService”。 那么任何人都可以用简单的例子解释 scheduledservice 的使用,以及它与 JavaFX 中的 'Service' 有何不同。谢谢 ;)
编辑:如何定义这个名为 DataThread 的 ScheduledService 应该每 5 秒重新启动一次?
public class DataThread extends ScheduledService<Void>
{
@Override
public Task<Void> createTask() {
return new Task<Void>() {
@Override
public Void call() throws Exception {
for(i=0;i<10;i++)
{
System.out.println(""+i);
}
return null;
}
};
}
}
考虑到您对 Service
class. ScheduledService
有充分的了解,这只是一个具有调度功能的服务。
来自文档
The ScheduledService is a Service which will automatically restart itself after a successful execution, and under some conditions will restart even in case of failure
所以我们可以这样说,
Service -> Execute One Task
ScheduledService -> Execute Same Task at regular intervals
定时服务的一个非常简单的例子是TimerService,它计算服务任务被调用的次数。预定每1秒调用一次
import java.util.concurrent.atomic.AtomicInteger;
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.concurrent.ScheduledService;
import javafx.concurrent.Task;
import javafx.concurrent.WorkerStateEvent;
import javafx.event.EventHandler;
import javafx.stage.Stage;
import javafx.util.Duration;
public class TimerServiceApp extends Application {
@Override
public void start(Stage stage) throws Exception {
TimerService service = new TimerService();
AtomicInteger count = new AtomicInteger(0);
service.setCount(count.get());
service.setPeriod(Duration.seconds(1));
service.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
System.out.println("Called : " + t.getSource().getValue()
+ " time(s)");
count.set((int) t.getSource().getValue());
}
});
service.start();
}
public static void main(String[] args) {
launch();
}
private static class TimerService extends ScheduledService<Integer> {
private IntegerProperty count = new SimpleIntegerProperty();
public final void setCount(Integer value) {
count.set(value);
}
public final Integer getCount() {
return count.get();
}
public final IntegerProperty countProperty() {
return count;
}
protected Task<Integer> createTask() {
return new Task<Integer>() {
protected Integer call() {
//Adds 1 to the count
count.set(getCount() + 1);
return getCount();
}
};
}
}
}