Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Синхронизация потоков. Java

#java #многопоточность #synchronized


Столкнулся с задачей реализации вывода потоками на экран информации в строго определенном
порядке. Без ограничения общности, пусть каждый поток выводит слово в бесконечном цикле,
требуется организовать вывод их на экран в алфавитном порядке.

Как устроить синхронизацию их работы?
Можно, как я понимаю, обращаться к глобальной переменной, её менять, приостанавливать
каждый поток при определенных её значениях...

Что посоветуете?
    


Ответы

Ответ 1



Поройтесь в java.util.concurrent.synchronizers. Скорее всего вам понадобится CountDownLatch Можно ставить блочить все остальные потоки, пока один поток не дойдет до точки разблокировки. Пошорудить их так, чтобы они поочередно друг друга разблокировали. А вобще, есть хорошая статья в которой эту библиотеку подробно разбирают. Не это, так другое найдете. UPD Во! Я все ее искал то! Вот тут более наглядно и с картинками.

Ответ 2



Самый простой вариант, который пришел в голову. Каждому потоку даем некоторый порядковый номер, заводим глобальную переменную и последовательно ее искрементируем. public class Solution { private static int counter = 0; private static final int THREAD_COUNT = 10; public static void main(final String[] args) throws InterruptedException { for (int i = 0; i < THREAD_COUNT; i++) { Printer printer = new Printer(i, Arrays.toString(Character.toChars(i + 'a'))); Runnable task = () -> { while (!Thread.currentThread().isInterrupted()) print(printer); }; new Thread(task).start(); } while (!Thread.currentThread().isInterrupted()) TimeUnit.SECONDS.sleep(10); } private static void print(Printer printer) { while (!Thread.currentThread().isInterrupted()) { synchronized (Solution.class) { if (counter == printer.id) { counter = (counter + 1) % THREAD_COUNT; System.out.println(printer.word); } } } } private static class Printer { private final int id; private final String word; Printer(int id, String word) { this.id = id; this.word = word; } }

Комментариев нет:

Отправить комментарий