我正在开发一款扑克游戏。在投注阶段,我使用Red5 iSchedulingService创建一个预定作业,该作业将每8秒运行一次,以转发给下一个玩家下注。现在,如果用户在8秒结束前下注,我想手动强制下一个预定作业开始。
有没有办法强制计划作业在需要时立即启动?
答案 0 :(得分:1)
您可以使用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;
}
}
答案 1 :(得分:1)
我在这个帖子中开始的具体问题的答案:
我无法强制启动预定作业,但我可以做的是删除预定作业并以0秒的延迟开始新作业。
addScheduledJobAfterDelay()返回表示作业ID的字符串。我可以用它来删除预定的工作。问题是没有办法知道我是否打断了预定的工作。执行人确实提供了这些信息。这就是为什么Executors在这个特定情况下是更好的选择,然后使用red5调度服务。
如何删除预定作业(red5):
ISchedulingService scheduler = (ISchedulingService) getScope().getContext().getBean(ISchedulingService.BEAN_NAME);
scheduler.removeScheduledJob("ScheduleJobString");
字符串ScheduleJobString
应替换为您从创建作业时收到的字符串:
String scheduleJobString = scheduler.addScheduledOnceJob(DelayInSeconds*1000,new MyJob());