在单个线程上连续监视 Java 中的函数
Continuous Monitoring of a function in Java on a single thread
我在特定的 class 中有一个方法,我需要后续执行以大致固定的时间间隔进行,间隔由指定的时间段隔开。我需要使用 ScheduledExecutorService
来执行此操作。
此外,即使从任何地方多次调用此方法,我也希望在不启动新线程的情况下执行同一个线程。
我怎样才能做到这一点?
创建 Runnable 的实现 class(使其成为单例)
public class MainTask implements Runnable {
private static MainTask mainTask;
private MainTask(){ }
public static MainTask getInstance(){
if(mainTask==null){
mainTask = new MainTask();
}
return mainTask;
}
@Override
public void run() {
// task to run goes here
System.out.println("Hello !! " + Thread.currentThread().getName());
}
}
利用scheduleAtFixedRate的方法
ScheduledExecutorService 方法,以便按指定时间间隔定期执行任务。
它的方法定义是
ScheduledFuture scheduleAtFixedRate(可运行命令,
长初始延迟,
长时间,
TimeUnit单位)
在哪里
period = 连续执行之间的周期。
请注意,此值可能是 min/hrs/days 等,具体取决于配置的 TimeUnit。
由于您希望其他 class 使用此功能我建议您可以将线程创建和任务创建封装在另一个 class 中并允许Class.methodName for.e.g MyScheduler.execute() 使用它;
public class MyScheduler {
private static ScheduledExecutorService service;
private static MainTask mainTask;
static {
service = Executors.newSingleThreadScheduledExecutor();
mainTask = MainTask.getInstance();
}
public static void execute() {
service.scheduleAtFixedRate(mainTask, 0, 4, TimeUnit.SECONDS);
}
}
我在特定的 class 中有一个方法,我需要后续执行以大致固定的时间间隔进行,间隔由指定的时间段隔开。我需要使用 ScheduledExecutorService
来执行此操作。
此外,即使从任何地方多次调用此方法,我也希望在不启动新线程的情况下执行同一个线程。
我怎样才能做到这一点?
创建 Runnable 的实现 class(使其成为单例)
public class MainTask implements Runnable { private static MainTask mainTask; private MainTask(){ } public static MainTask getInstance(){ if(mainTask==null){ mainTask = new MainTask(); } return mainTask; } @Override public void run() { // task to run goes here System.out.println("Hello !! " + Thread.currentThread().getName()); } }
利用scheduleAtFixedRate的方法 ScheduledExecutorService 方法,以便按指定时间间隔定期执行任务。
它的方法定义是
ScheduledFuture scheduleAtFixedRate(可运行命令, 长初始延迟, 长时间, TimeUnit单位)
在哪里 period = 连续执行之间的周期。 请注意,此值可能是 min/hrs/days 等,具体取决于配置的 TimeUnit。
由于您希望其他 class 使用此功能我建议您可以将线程创建和任务创建封装在另一个 class 中并允许Class.methodName for.e.g MyScheduler.execute() 使用它;
public class MyScheduler { private static ScheduledExecutorService service; private static MainTask mainTask; static { service = Executors.newSingleThreadScheduledExecutor(); mainTask = MainTask.getInstance(); } public static void execute() { service.scheduleAtFixedRate(mainTask, 0, 4, TimeUnit.SECONDS); } }