private void setupCutoffTimers() { Logger cutoffLogger = sessionLogger(); Random random = new Random(); int cutoffIfSimultaneous = (int) (random.nextDouble() * (latestCutoff - earliestCutoff)); if (simultaneousCutoff) { cutoffLogger.info("using a simultaneous cutoff of " + cutoffIfSimultaneous + " seconds."); } Iterator<String> nameIterator = playerNameIterator(); while (nameIterator.hasNext()) { Judge judge = getJudgeOrNull(nameIterator.next()); if (judge == null) { continue; } int cutoff; if (simultaneousCutoff) { cutoff = cutoffIfSimultaneous; } else { cutoff = earliestCutoff + (int) (random.nextDouble() * (latestCutoff - earliestCutoff)); cutoffLogger.info( "using a cutoff for judge '" + judge.getName() + "' of " + cutoff + " seconds."); int roundDuration = timeLimit(); if (cutoff > roundDuration + 10) { cutoff = roundDuration + 10; cutoffLogger.info( "reducing timeout to " + cutoff + " (10 seconds after round finishes)."); } } TimerTask task = judge.getCutoffTimer(); timer.schedule(task, 1000 * cutoff); } }