我正在开发一款扑克游戏。在投注阶段,我使用 Red5 iSchedulingService 创建了一个计划作业,该作业将每 8 秒运行一次,以转发给下一个下注的玩家。现在,如果用户在 8 秒结束之前下注,我想手动强制启动下一个预定作业。
有没有办法强制计划的作业在需要时立即开始?
我正在开发一款扑克游戏。在投注阶段,我使用 Red5 iSchedulingService 创建了一个计划作业,该作业将每 8 秒运行一次,以转发给下一个下注的玩家。现在,如果用户在 8 秒结束之前下注,我想手动强制启动下一个预定作业。
有没有办法强制计划的作业在需要时立即开始?
我在这个线程中开始的具体问题的答案:
我不能强制开始计划的工作,但我可以做的是删除计划的工作并开始一个延迟为 0 秒的新工作。
addScheduledJobAfterDelay() 返回一个表示作业 ID 的字符串。我可以用它来删除预定的工作。问题是没有办法知道我是否中断了预定的工作。执行者确实提供了这些信息。这就是为什么在这种特定情况下执行器是比使用 red5 调度服务更好的选择。
如何删除计划作业(red5):
ISchedulingService scheduler = (ISchedulingService) getScope().getContext().getBean(ISchedulingService.BEAN_NAME);
scheduler.removeScheduledJob("ScheduleJobString");
该字符串ScheduleJobString
应替换为您从创建作业中收到的字符串:
String scheduleJobString = scheduler.addScheduledOnceJob(DelayInSeconds*1000,new MyJob());
您可以使用Executors 执行此操作。有更简洁的实现,但这是一个刺和基本的东西,可以使用Future和Callable做你想做的事情。
// wherever you set up the betting stage
ScheduledExecutorService bettingExecutor =
Executors.newSingleThreadScheduledExecutor();
ScheduledFuture<?> future = bettingExecutor.schedule(new BettingStage(), 8,
TimeUnit.SECONDS);
//...
// in the same class (or elsewhere as a default/protected/public class)
private class BettingStage implements Callable<ScheduledFuture<?>> () {
public ScheduledFuture<?> call() thows ExecutionException {
ScheduledFuture<?> future = bettingExecutor.schedule(new BettingStage(), 8,
TimeUnit.SECONDS);
// betting code here
boolean canceled = future.cancel(false); // cancels the task if not running yet
if(canceled) {
// run immediately
future = bettingExecutor.schedule(new BettingStage(),
0, TimeUnit.SECONDS)
}
return future;
}
}