/** * Copyright (c) 2009-2011, The HATS Consortium. All rights reserved. * This file is licensed under the terms of the Modified BSD License. */ package abs.backend.java.scheduling; import java.util.List; import java.util.Random; import java.util.logging.Logger; import abs.backend.java.lib.runtime.Logging; import abs.backend.java.scheduling.SimpleTaskScheduler.TaskInfo; /** * A scheduling strategy that randomly chooses the next task * * It is possible to set the initial seed used for the random generator by * setting the property abs.schedulerseed to some long value. * * @author Jan Schäfer * */ public class RandomSchedulingStrategy implements TotalSchedulingStrategy, UsesRandomSeed { private final static Logger logger = Logging.getLogger(RandomSchedulingStrategy.class.getName()); private Random random; public RandomSchedulingStrategy() { } public RandomSchedulingStrategy(Random r) { random = r; } public void setRandom(Random r) { random = r; } @Override public synchronized TaskInfo schedule(TaskScheduler scheduler, List<TaskInfo> schedulableTasks) { return schedulableTasks.get(random.nextInt(schedulableTasks.size())); } @Override public synchronized ScheduleAction choose(ScheduleOptions options) { ScheduleAction a = options.allOptions().get(random.nextInt(options.numOptions())); String suff = options.numOptions() == 1 ? " (NO CHOICE)" : ""; logger.finest("Choosing " + a.shortString() + " from " + shortStringList(options.allOptions()) + suff); return a; } private String shortStringList(List<ScheduleAction> allOptions) { StringBuilder res = new StringBuilder(); res.append("{"); boolean first = true; for (ScheduleAction a : allOptions) { if (first) first = false; else res.append(", "); res.append(a.shortString()); } res.append("}"); return res.toString(); } }