在 java 中获得计时器的结果
get the result of a timer in java
所以我有一个来自 java.util.timer 的计时器
在它的 运行 方法中,我从另一个 class 创建一个对象,并将结果放入如下静态数组中:
public class Generator {
public Timer timer;
int seconds = 2;
final int maxCalls = 3;
int currNumCall = 0;
public static boolean running = false;
public Generator() {
this.timer = new Timer();
this.timer.schedule(new ReminderTask(), seconds * 1000);
}
class ReminderTask extends TimerTask {
@Override
public void run() {
if (currNumCall < maxCalls) {
System.out.println("picking up a new call");
running = true;
int i = ThreadLocalRandom.current().nextInt(0, 2);
Call call;
if (i > 0) {
call = new Call("high", LocalDateTime.now());
} else {
call = new Call("low", LocalDateTime.now());
}
calls.add(call);
currNumCall += 1;
timer.cancel();
timer = new Timer();
timer.schedule(new ReminderTask(), seconds * 1000);
} else {
timer.cancel();
running = false;
}
}
}
在另一个 class 中,我从生成器 class 启动一个对象以填充调用数组
现在我需要对调用进行一些操作,所以我在下面做了一些类似的事情:
public class Fire_staton_problem {
public static ArrayList<Junior> juniors = new ArrayList<>();
public static ArrayList<Senior> seniors = new ArrayList<>();
public static ArrayList<Manager> managers = new ArrayList<>();
public static ArrayList<Director> directors = new ArrayList<>();
public static ArrayList<Call> calls = new ArrayList<>();
public Generator generator;
public Fire_staton_problem() {
generator = new Generator();
}
public static void main(String[] args) {
Fire_staton_problem f = new Fire_staton_problem();
while(f.generator.isRunning()) {
if (calls.size() > 0) {
System.out.println(calls);
}else {
System.out.println("empty :)");
}
}
}
}
不幸的是,这不起作用...我该怎么做才能连续处理计时器的结果我的意思是继续检查数据是否存在然后做一些事情,我不想只是迭代数组。 ..提前致谢,如果问题不太清楚,请告知。
研究生产者-消费者模式,因为它本质上就是这样 - Generator
是生产者,而你的 Fire_staton_problem
是消费者。明显的东西:
- 你的
while
循环忙着检查列表,但你在这里需要的是一个 BlockingQueue
而不是一个简单的列表,所以当它为空时它会暂停 main
线程,并会在您的 Generator
将 Call
放入其中时将其唤醒。
- 您不需要为 运行 任务再次创建
Timer
的新实例,只需使用 Timer(task, 0, delay)
构造函数来 repeat 任务。
所以我有一个来自 java.util.timer 的计时器 在它的 运行 方法中,我从另一个 class 创建一个对象,并将结果放入如下静态数组中:
public class Generator {
public Timer timer;
int seconds = 2;
final int maxCalls = 3;
int currNumCall = 0;
public static boolean running = false;
public Generator() {
this.timer = new Timer();
this.timer.schedule(new ReminderTask(), seconds * 1000);
}
class ReminderTask extends TimerTask {
@Override
public void run() {
if (currNumCall < maxCalls) {
System.out.println("picking up a new call");
running = true;
int i = ThreadLocalRandom.current().nextInt(0, 2);
Call call;
if (i > 0) {
call = new Call("high", LocalDateTime.now());
} else {
call = new Call("low", LocalDateTime.now());
}
calls.add(call);
currNumCall += 1;
timer.cancel();
timer = new Timer();
timer.schedule(new ReminderTask(), seconds * 1000);
} else {
timer.cancel();
running = false;
}
}
}
在另一个 class 中,我从生成器 class 启动一个对象以填充调用数组 现在我需要对调用进行一些操作,所以我在下面做了一些类似的事情:
public class Fire_staton_problem {
public static ArrayList<Junior> juniors = new ArrayList<>();
public static ArrayList<Senior> seniors = new ArrayList<>();
public static ArrayList<Manager> managers = new ArrayList<>();
public static ArrayList<Director> directors = new ArrayList<>();
public static ArrayList<Call> calls = new ArrayList<>();
public Generator generator;
public Fire_staton_problem() {
generator = new Generator();
}
public static void main(String[] args) {
Fire_staton_problem f = new Fire_staton_problem();
while(f.generator.isRunning()) {
if (calls.size() > 0) {
System.out.println(calls);
}else {
System.out.println("empty :)");
}
}
}
}
不幸的是,这不起作用...我该怎么做才能连续处理计时器的结果我的意思是继续检查数据是否存在然后做一些事情,我不想只是迭代数组。 ..提前致谢,如果问题不太清楚,请告知。
研究生产者-消费者模式,因为它本质上就是这样 - Generator
是生产者,而你的 Fire_staton_problem
是消费者。明显的东西:
- 你的
while
循环忙着检查列表,但你在这里需要的是一个BlockingQueue
而不是一个简单的列表,所以当它为空时它会暂停main
线程,并会在您的Generator
将Call
放入其中时将其唤醒。 - 您不需要为 运行 任务再次创建
Timer
的新实例,只需使用Timer(task, 0, delay)
构造函数来 repeat 任务。