Пример барьера параллелизма Java - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь реализовать пользовательский пример Barrier, чтобы узнать больше о параллелизме в Java. У меня есть работающий класс:

public class Barrier implements Runnable {

    private static Semaphore barrier = new Semaphore(0);
    private static int toWait = 5;
    private static int counter = 0;

    private static long sleepTime;

    public static int ID = 0;

    private int id = ++ID;

    public Barrier(long sleep){
        sleepTime = sleep;
    }

    @Override
    public void run() {

        try {

            Thread.sleep(sleepTime);

            counter++;
            if (counter == toWait){
                barrier.release(counter);
            }
            barrier.acquire();

            System.out.println("Thread with sleep: " + id + " proceeds");

        } catch (InterruptedException ex) {
            Logger.getLogger(Barrier.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

}

Затем в функции main я создаю 5 потоков и запускаю их. После запуска я захожу в тупик, который не могу решить. Может кто-нибудь сказать мне, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Не было взаимного исключения. Чтобы решить эту проблему, мне нужно было добавить еще один семафор и окружить приращение счетчика с помощью acquire release этого семафора.

0 голосов
/ 01 мая 2018

См. Документацию:

Получает разрешение, если оно доступно, и немедленно возвращается, уменьшая количество доступных разрешений на единицу.

Если разрешение недоступно, текущий поток отключается для целей планирования потока и остается неактивным, пока не произойдет одно из двух:

Какой-то другой поток вызывает метод release () для этого семафора, и текущему потоку будет назначено разрешение; или же Какой-то другой поток прерывает текущий поток.

Таким образом, поскольку вы aquire используете все потоки один раз, и ни один из них не освобождается, они все останутся связанными. Может быть, установите счетчик из них на 5. Таким образом, вы освобождаете последний элемент и удаляете состояние цвета других элементов, делая это.

Редактировать: о, и ваш семафор имеет 0 разрешений. Инициализируйте это с 1 или 2 для вашего случая.

...