在给定延迟的特定时间间隔内安排 java 进程
Scheduling java process for a specific time interval with a given delay
我们想安排一个 java 进程到 运行 直到一个特定的时间间隔。目前我正在考虑使用 TimerTask
来安排这个过程。在每个循环开始时,将检查当前时间,然后与给定时间进行比较,如果时间已过,则停止该过程。
我们的代码如下所示:
import java.util.Timer;
import java.util.TimerTask;
public class Scheduler extends TimerTask{
public void run(){
//compare with a given time, with getCurrentTime , and do a System.exit(0);
System.out.println("Output");
}
public static void main(String[] args) {
Scheduler scheduler = new Scheduler();
Timer timer = new Timer();
timer.scheduleAtFixedRate(scheduler, 0, 1000);
}
}
有更好的方法吗?
您可以为上述时间限制安排另一项任务并在您的计时器上调用取消,而不是在每次迭代中检查是否已达到时间限制。
根据复杂性,您可能会考虑使用 ScheduledExecutorService,例如 ScheduledThreadPoolExecutor。 See in this answer when and why.
带计时器的简单工作示例:
public class App {
public static void main(String[] args) {
final Timer timer = new Timer();
Timer stopTaskTimer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("Output");
}
};
TimerTask stopTask = new TimerTask() {
@Override
public void run() {
timer.cancel();
}
};
//schedule your repetitive task
timer.scheduleAtFixedRate(task, 0, 1000);
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse("2015-06-09 14:06:30");
//schedule when to stop it
stopTaskTimer.schedule(stopTask, date);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
您可以使用 RxJava,一个非常强大的响应式编程库。
Observable t = Observable.timer(0, 1000, TimeUnit.MILLISECONDS);
t.subscribe(new Action1() {
@Override
public void call(Object o) {
System.out.println("Hi "+o);
}
}
) ;
try {
Thread.sleep(10000);
}catch(Exception e){ }
您甚至可以使用 lambda 语法:
Observable t = Observable.timer(0, 1000, TimeUnit.MILLISECONDS);
t.forEach(it -> System.out.println("Hi " + it));
try {
Thread.sleep(10000);
}catch(Exception e){ }
我们想安排一个 java 进程到 运行 直到一个特定的时间间隔。目前我正在考虑使用 TimerTask
来安排这个过程。在每个循环开始时,将检查当前时间,然后与给定时间进行比较,如果时间已过,则停止该过程。
我们的代码如下所示:
import java.util.Timer;
import java.util.TimerTask;
public class Scheduler extends TimerTask{
public void run(){
//compare with a given time, with getCurrentTime , and do a System.exit(0);
System.out.println("Output");
}
public static void main(String[] args) {
Scheduler scheduler = new Scheduler();
Timer timer = new Timer();
timer.scheduleAtFixedRate(scheduler, 0, 1000);
}
}
有更好的方法吗?
您可以为上述时间限制安排另一项任务并在您的计时器上调用取消,而不是在每次迭代中检查是否已达到时间限制。
根据复杂性,您可能会考虑使用 ScheduledExecutorService,例如 ScheduledThreadPoolExecutor。 See in this answer when and why.
带计时器的简单工作示例:
public class App {
public static void main(String[] args) {
final Timer timer = new Timer();
Timer stopTaskTimer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("Output");
}
};
TimerTask stopTask = new TimerTask() {
@Override
public void run() {
timer.cancel();
}
};
//schedule your repetitive task
timer.scheduleAtFixedRate(task, 0, 1000);
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse("2015-06-09 14:06:30");
//schedule when to stop it
stopTaskTimer.schedule(stopTask, date);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
您可以使用 RxJava,一个非常强大的响应式编程库。
Observable t = Observable.timer(0, 1000, TimeUnit.MILLISECONDS);
t.subscribe(new Action1() {
@Override
public void call(Object o) {
System.out.println("Hi "+o);
}
}
) ;
try {
Thread.sleep(10000);
}catch(Exception e){ }
您甚至可以使用 lambda 语法:
Observable t = Observable.timer(0, 1000, TimeUnit.MILLISECONDS);
t.forEach(it -> System.out.println("Hi " + it));
try {
Thread.sleep(10000);
}catch(Exception e){ }