#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; } }
Комментариев нет:
Отправить комментарий