Значение фазы фазера выходит за пределы - PullRequest
0 голосов
/ 07 февраля 2019

Учитывая, класс с методом main, который инициализирует Phaser и создает (скажем) 3 потока для подсчета фаз на одном и том же Phaser.

public class PhaserDemo2 implements Runnable {

    private static Phaser CLASS_PHASER;
    private static int COUNTER;

    public static void main(String[] args) {
        COUNTER = 5;
        // create a Phaser and register main Thread
        CLASS_PHASER = new Phaser(1);
        System.out.println(Integer.MIN_VALUE);
        System.out.println("Phase value:" + CLASS_PHASER.getPhase() + ", Registered Parties:" 
                + CLASS_PHASER.getRegisteredParties() + ", and Counter:" + COUNTER);
        // create 3 Threads
        new Thread(new PhaserDemo2()).start();
        new Thread(new PhaserDemo2()).start();
        new Thread(new PhaserDemo2()).start();
        // de-register main Thread
        CLASS_PHASER.arriveAndDeregister();
    }

    @Override
    public void run() {
        // register the current Thread with Phaser
        CLASS_PHASER.register();
        // print details
        System.out.println("Phase value:" + CLASS_PHASER.getPhase() + ", Registered Parties:" 
                + CLASS_PHASER.getRegisteredParties() + ", and Counter:" + COUNTER);
        // wait till other Threads have printed as well
        CLASS_PHASER.arriveAndAwaitAdvance();
        // de-register this Thread
        CLASS_PHASER.arriveAndDeregister();
    }
}

Код отлично работает для большинства выполнений и производитвывод, как показано ниже,

-2147483648
Phase value:0, Registered Parties:1, and Counter:5
Phase value:0, Registered Parties:2, and Counter:5
Phase value:1, Registered Parties:2, and Counter:5
Phase value:1, Registered Parties:3, and Counter:5

-2147483648
Phase value:0, Registered Parties:1, and Counter:5
Phase value:0, Registered Parties:2, and Counter:5
Phase value:0, Registered Parties:3, and Counter:5
Phase value:0, Registered Parties:3, and Counter:5

Но для некоторых нечетных выполнений он производит вывод, подобный приведенному ниже

-2147483648
Phase value:0, Registered Parties:1, and Counter:5
Phase value:0, Registered Parties:2, and Counter:5
Phase value:0, Registered Parties:3, and Counter:5
Phase value:-2147483646, Registered Parties:0, and Counter:5

-2147483648
Phase value:0, Registered Parties:1, and Counter:5
Phase value:0, Registered Parties:2, and Counter:5
Phase value:-2147483646, Registered Parties:0, and Counter:5
Phase value:-2147483646, Registered Parties:0, and Counter:5

-2147483648
Phase value:0, Registered Parties:1, and Counter:5
Phase value:-2147483647, Registered Parties:0, and Counter:5
Phase value:-2147483647, Registered Parties:0, and Counter:5
Phase value:-2147483647, Registered Parties:0, and Counter:5

Я не уверен, может ли это быть успешно реплицировано или нет, как это происходиточень редко.В противном случае хотелось бы узнать, что является причиной неправильности. Декларация: просто новичок в Phaser

1 Ответ

0 голосов
/ 07 февраля 2019

Когда вы получаете отрицательное значение в качестве значения фазы - ваша фаза заканчивается.

Выдержка из Java doc для .getPhase() метод:

Возвращает текущий номер фазы.Максимальный номер фазы - Integer.MAX_VALUE, после чего он перезапускается с нуля.После завершения номер фазы является отрицательным, и в этом случае преобладающая фаза до завершения может быть получена через getPhase () + Integer.MIN_VALUE.

Итак, почему это происходит?

Из того же документы Раздел завершения:

Прекращение запускается, когда вызов onAdvance возвращает значение true.Реализация по умолчанию возвращает true, если в результате отмены регистрации число зарегистрированных сторон стало равным нулю.

В вашем случае иногда число зарегистрированных сторон становится равным 0. Например, это возможно, когда вызарегистрировать основную тему, и хотя ни одна из ваших тем не была зарегистрирована, вы отменяете регистрацию основной темы.Этот случай:

-2147483648
Phase value:0, Registered Parties:1, and Counter:5
Phase value:-2147483647, Registered Parties:0, and Counter:5
Phase value:-2147483647, Registered Parties:0, and Counter:5
Phase value:-2147483647, Registered Parties:0, and Counter:5

Также есть другой случай. Выдержка из baeldung :

Вызов метода receiveAndAwaitAdvance () заставит текущий поток ждать на барьере.Как уже упоминалось, когда число прибывших сторон станет таким же, как количество зарегистрированных сторон, исполнение будет продолжено.

И этот случай может быть:

-2147483648
Phase value:0, Registered Parties:1, and Counter:5
Phase value:0, Registered Parties:2, and Counter:5
Phase value:-2147483646, Registered Parties:0, and Counter:5
Phase value:-2147483646, Registered Parties:0, and Counter:5
...