Как я могу чередовать вызовы методов в Java - PullRequest
0 голосов
/ 18 марта 2019

Я хочу вызвать два метода, но я хочу вызывать только один из них одновременно.

В следующий раз, когда я захочу позвонить тому, кто не был вызван ранее, в стиле Round Robin

Пример:

void mainMethod(){
     Obj val;

     if(somthing)
        val = implMethod1();
     else{
        val = implMethod2();
     }
}

Использование оператора if - это то, что можно сделать.Но есть ли из коробки вещь, которую я могу использовать для достижения того же?

Ответы [ 7 ]

3 голосов
/ 18 марта 2019

Вы можете использовать AtomicBoolean для обеспечения безопасности потока Round Robin :

AtomicBoolean roundRobin = new AtomicBoolean(false);
void mainMethod(){
     Object val;
     if (roundRobin.compareAndSet(false, true)) {
         val = implMethod1();
     } else {
        val = implMethod2();
        roundRobin.set(false);
     }
}

Логическое значение, которое может быть обновлено атомарно.

2 голосов
/ 18 марта 2019

Просто объявите логическую переменную в вашем объекте:

public class MainClass {
    private boolean useMethod1 = true;

    public void mainMethod() {
        if (useMethod1) {
            method1();
        } else {
            method2();
        }
        useMethod1 = !useMethod1;
    }
}

Вы можете делать то же самое в статическом режиме, если вы не хотите создавать экземпляр объекта и хотите, чтобы он был безопасным для потоков, добавьте синхронизированный перед mainMethod ()

1 голос
/ 18 марта 2019
static int count = 0;

void mainMethod(){
    Obj val;

    if(somthing && count%2 == 0)
        val = implMethod1();
    else{
        val = implMethod2();
    }
    count ++;
}

Вы можете попробовать приведенный выше код.

1 голос
/ 18 марта 2019

Я не правильно понял вопрос:

boolean first = true;
if(somthing && first) {
    val = implMethod1();
    first = false;
} else {
    val = implMethod2();
    first = true;
}
0 голосов
/ 18 марта 2019

Вы можете использовать очередь:

Инициализировать очередь:

import java.util.LinkedList;
import java.util.Queue;

....

Queue<String> methodQueue = new LinkedList<>();
methodQueue.add("implMethod1");

Использовать очередь в вашем методе:

void mainMethod(methodQueue){
 somthing = methodQueue.poll()
 Obj val;

 if(somthing.equals('implMethod1'))
    val = implMethod1();
    methodQueue.add('implMethod2')

 else{
    val = implMethod2();
    methodQueue.add('implMethod1')
 }
}
0 голосов
/ 18 марта 2019
private static boolean check = true;

void mainMethod() {
    Obj val;

    if(check) {
       val = implMethod1();
       check = !check;
    } else {
       val = implMethod2();
      check = !check;
     }
}

Это может вам помочь.

0 голосов
/ 18 марта 2019

Предполагая, что что-то является переменной boolean, вы можете достичь этого, используя следующую стратегию:

void mainMethod(){
     Obj val;

     if(somthing)
        val = implMethod1();
        somthing=false;
     else{
        val = implMethod2();
        somthing=true;
     }
}
...