2016-03-10 5 views
1

У меня есть фрагмент кода, который записывает объект на диск, когда объект помещается в LinkedBlockingQueue.Создание нескольких потоков для записи файлов на диск, Java

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

Я не уверен, могу ли я использовать ThreadPool здесь, поскольку я не знаю, когда объект будет помещен в очередь! теперь, если я решаю иметь fixedThreadPool из 5 потоков, как мне распределить его между несколькими объектами?

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

ответ

0

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

0

how do i distribute it among multiple objects?

Ну, вам не придется беспокоиться о распределении задач. Все, что вам нужно сделать, это отправить исполняемый файл или вызов (который описывает вашу задачу), и он будет передан в простаивающий поток в пуле или если все потоки заняты обработкой, эта новая задача будет ждать в очереди.

Ниже то, что вы можете попробовать ...

1) Создать пул потоков, который соответствует вашим потребностям лучше.

ExecutorService es = Executors.newFixedThreadPool(desiredNoOfThreads); 

2) Как у вас уже есть очередь на месте -

while (true) { 
    //peek or poll the queue and check for non null value 
    //if not null then create a runnable or callable and submit 
    //it to the ExecutorService 
} 
+0

Спасибо @Tirath за ваш ответ. Я в значительной степени убежден. всего лишь 1 сомнение. Если у меня есть несколько потоков, которые прослушивают одну и ту же очередь, это не создаст проблем? 2 потока могут сразу выбрать один и тот же объект! это обрабатывается ThreadPool? ли Threadpool гарантирует, что только 1 поток будет иметь доступ к 1 объекту в очереди? – Ninja

+0

'LinkedBlockingQueue' - это поточно-безопасный класс. Поэтому нет необходимости беспокоиться о том, что несколько потоков обращаются к одной и той же очереди. Его все позаботились. – Tirath

+0

Здесь я попал в другой вопрос. Я создал ThreadPool, потоки прослушивают LinkedBlockingQueue. теперь у меня есть cacheEntrySet, который является объектом в очереди. этот набор также имеет имя файла, который будет записан на диск. Если два объекта имеют одинаковое имя файла, он должен записываться в тот же файл на диске. Как я могу убедиться, что 2 потока не записываются в один файл? так как это испортит мои данные. как назначить поток на основе имени файла? – Ninja

Смежные вопросы