У меня был проект, в котором мне нужно было создать 90-секундные превью из больших файлов MP4. Я сделал так, чтобы несколько потоков запускались с доступом к общей очереди имен файлов. Каждый поток потребляет работу из очереди с помощью queue.poll ().
Вот конструктор:
public Worker(Queue<String> queue, String conferenceYear, CountDownLatch startSignal, CountDownLatch doneSignal) {
this.queue = queue;
this.startSignal = startSignal;
this.doneSignal = doneSignal;
}
Затем, как я уже сказал выше, я продолжаю опрашивать данные:
public void run() {
while (!queue.isEmpty()) {
String fileName = queue.poll() + ".mp4";
File f = new File("/home/ubuntu/preview_" + fileName);
if (fileName != null && !f.exists()) {
System.out.println("Processing File " + fileName + "....");
Я запустил эти темы в другом классе под названием WorkLoad:
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
BlockingQueue<String> filesToDownload = new LinkedBlockingDeque<String>(1024);
BlockingQueue<String> filesToPreview = new LinkedBlockingDeque<String>(1024);
BlockingQueue<String> filesToUpload = new LinkedBlockingDeque<String>(1024);
for (int x = 0; x < NUMBER_OF_THREADS; x++) {
workers[x] = new Thread(new Worker(filesToPreview, currentYear, startSignal, doneSignal));
workers[x].start();
}
В вашем конкретном случае вы можете предоставить каждому потоку свое собственное имя файла или дескриптор файла. Если вы хотите, чтобы имена файлов и записи располагались в хронологическом порядке, просто запустите 2 потока, 1 для сбора данных и помещения в очередь, с барьером / лимитом в 1000 записей, а другой поток в качестве потребителя.