Как делить переменные с потоками в Java? - PullRequest
0 голосов
/ 18 июля 2011

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

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

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

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

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

Пример: если поток1 обновляет некоторое логическое значение до true, автоматически, все остальные потоки имеют этот логический тип как true.

Ответы [ 2 ]

4 голосов
/ 18 июля 2011

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

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


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


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

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

0 голосов
/ 19 июля 2011

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

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);
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...