Как делить переменные с потоками в Java?

Моя программа будет использовать потоки, но некоторые переменные, такие как коллекция ссылок / страниц, информация о запросах (обновляется или нет) и некоторые другие сведения (логические поля, поля int и т. Д.) Должны совместно использоваться потоками.

В этом случае все потоки будут обрабатывать одну и ту же работу, но в разных элементах коллекции.

Я хочу знать, есть ли способ сделать это, не создавая класс / объект только для хранения этих общих данных.

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

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

Пример: если thread1 обновит некоторое логическое значение до true, автоматически, все другие потоки будут иметь это логическое значение как true.

2 ответа

Решение

Если вам нужно обмениваться данными между потоками, вам нужно убедиться, что они распределяются синхронно, т. Е. Структуры данных являются потокобезопасными.

Посмотрите на java.util.concurrent пакет. Вы могли бы, например, использовать один из BlockingQueue реализации (ArrayBlockingQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue).


Что касается вашего комментария: посмотрите также на java.util.concurrent.atomic пакет. Там вы найдете такие классы, как AtomicBoolean, AtomicInteger, AtomicReference и так далее.


Пример: если thread1 обновит некоторое логическое значение до true, автоматически, все другие потоки будут иметь это логическое значение как true.

Я бы предложил вам использовать AtomicBoolean в таком случае. Вы могли бы предположительно также использовать обычный boolean пока ты это заявляешь volatile (если вам не нужны операции сравнения и установки и т. д.).

Вы можете сделать что-то вроде этого. Этот шаблон позволяет планировать несколько одновременных задач, не создавая слишком много задач одновременно.

ThreadPoolExecutor tpe = new ThreadPoolExecutor(10, 10, 10, TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>());
while(isMoreWork()) {
    while(tpe.getQueue().size() > 10) {
        Thread.sleep(1);
    }
    final String link = 
    tpe.submit(new Runnable() {
        @Override
        public void run() {
            processLink(link);
        }
    });
}
Другие вопросы по тегам