как многопоточность в Java - PullRequest
2 голосов
/ 01 ноября 2011

Мне нужно многопоточность метода, который запускает код в пакетах по 1000. Мне нужно дать эти партии в разные темы.

В настоящее время у меня есть 3 темы, но все 3 выбирают первую партию из 1000. Я хочу, чтобы другие партии не выбирали одну и ту же партию, а выбирали другую.

Пожалуйста, помогите и дайте предложения.

Ответы [ 4 ]

9 голосов
/ 01 ноября 2011

Я бы использовал ExecutorService

int numberOfTasks = ....
int batchSize = 1000;
ExecutorService es = Executors.newFixedThreadPool(3);
for (int i = 0; i < numberOfTasks; i += batchSize) {
    final int start = i;
    final int last = Math.min(i + batchSize, numberOfTasks);
    es.submit(new Runnable() {
        @Override
        public void run() {
            for (int j = start; j < last; j++)
                System.out.println(j); // do something with j
        }
    });
}
es.shutdown();
3 голосов
/ 01 ноября 2011

Поместите партии в BlockingQueue и заставьте свои рабочие потоки принимать партии из очереди.

3 голосов
/ 01 ноября 2011

Используйте lock или mutex при получении пакета. Таким образом, потоки не могут одновременно получить доступ к критической секции и не могут случайно получить доступ к одному и тому же пакету.

Я предполагаю, что вы удаляете партию, когда она была выбрана потоком.

РЕДАКТИРОВАТЬ: ответы aioobe и jonas лучше, используйте это. Это альтернатива. :)

3 голосов
/ 01 ноября 2011

Вам необходимо синхронизировать доступ к списку заданий в пакете. («Синхронизировать» по сути означает «убедиться, что потоки осведомлены о возможных состояниях гонки». В большинстве сценариев это означает «разрешить выполнение какого-либо метода одним потоком за раз».)

Это проще всего решить с помощью пакета java.util.concurrent. Взгляните на различные реализации BlockingQueue, например ArrayBlockingQueue или LinkedBlockingQueue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...