1

我正在开发一款扑克游戏。在投注阶段,我使用 Red5 iSchedulingService 创建了一个计划作业,该作业将每 8 秒运行一次,以转发给下一个下注的玩家。现在,如果用户在 8 秒结束之前下注,我想手动强制启动下一个预定作业。

有没有办法强制计划的作业在需要时立即开始?

4

2 回答 2

1

我在这个线程中开始的具体问题的答案:

我不能强制开始计划的工作,但我可以做的是删除计划的工作并开始一个延迟为 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());
于 2010-05-11T15:33:31.117 回答
1

您可以使用Executors 执行此操作。有更简洁的实现,但这是一个刺和基本的东西,可以使用FutureCallable做你想做的事情。

// 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;
    }
}
于 2010-05-05T14:52:34.897 回答