Я хотел бы использовать список из Runnable
и выбрать случайным образом из списка с уклоном пропорции:
static int method1Calls = 0;
static int method2Calls = 0;
static int method3Calls = 0;
static final void method1() {
System.out.println("method1");
method1Calls += 1;
}
static final void method2() {
System.out.println("method2");
method2Calls += 1;
}
static final void method3() {
System.out.println("method3");
method3Calls += 1;
}
Runnable call1 = new Runnable() {
@Override
public void run() {
method1();
}
};
Runnable call2 = new Runnable() {
@Override
public void run() {
method2();
}
};
Runnable call3 = new Runnable() {
@Override
public void run() {
method3();
}
};
public void test() {
// Put the three objects in a list.
List<Runnable> methods = Arrays.asList(call1, call2, call3);
// Call them in proportion.
int[] proportion = {0, 1, 1, 2, 2};
Random r = new Random();
for (int i = 0; i < 100; i++) {
// Pick one.
int n = r.nextInt(proportion.length);
// Run it.
methods.get(proportion[n]).run();
}
System.out.println("method1 called " + method1Calls + " times.");
System.out.println("method2 called " + method2Calls + " times.");
System.out.println("method3 called " + method3Calls + " times.");
}
гравюр в конце:
method1 called 26 times.
method2 called 40 times.
method3 called 34 times.
Для того, чтобы количество вызовов точно предсказуемый, но случайный, вам необходимо использовать механизм тасования:
public void testShuffle() {
System.out.println("Using shuffle");
// Put the three objects in a list.
List<Runnable> methods = new ArrayList<>();
// Call them in proportion
Runnable[] runners = {call1, call2, call3};
int[] proportion = {10, 20, 20};
// Grow my list.
for (int i = 0; i < proportion.length; i++) {
for (int j = 0; j < proportion[i]; j++) {
methods.add(runners[i]);
}
}
// Shuffle it.
Collections.shuffle(methods);
// Call them.
for (Runnable r : methods) {
r.run();
}
System.out.println("method1 called " + method1Calls + " times.");
System.out.println("method2 called " + method2Calls + " times.");
System.out.println("method3 called " + method3Calls + " times.");
}
Отпечатано:
method1 called 10 times.
method2 called 20 times.
method3 called 20 times.
Вы почти наверняка делаете что-то неправильно, если хотите этого. Какова проблема, которую вы пытаетесь решить? –
Есть [Thread # setPriority] (http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#setPriority (int)) достаточно? В противном случае это звучит так, как будто вам нужен собственный планировщик. –
Это точная проблема, которую я пытаюсь решить. Единственное хранилище, которое я могу использовать, - это файл свойств. – Learner