Я предполагаюсь к образам процесса в многопоточном режиме с помощью Java. Я могу, имея переменное количество изображений, где как мое количество потоков фиксируются. Я должен обработать все изображения с помощью фиксированного набора потоков.
Я просто застреваю о том, как сделать это, я взглянул ThreadExecutor и BlockingQueues и т.д... Я все еще не ясен. То, что я делаю, - Получают изображения и добавляют их в LinkedBlockingQueue, который имеет выполнимый код процессора изображения. - Создают threadpoolexecutor, для которого одним из arguements является LinkedBlockingQueue ранее. - Выполняют итерации через для цикла до размера очереди и делают threadpoolexecutor.execute (linkedblockingqueue.poll). - все, что я вижу, является этим, обрабатывает только 100 изображений, который является минимальным размером потока, переданным в размере LinkedBlockingQueue.
Я вижу, что я серьезно неправ в своем понимании где-нибудь, как я обрабатываю все изображения в наборах 100 (потоки), пока они все не сделаны? Любые примеры или psuedocodes были бы очень полезны
Спасибо! J
Вот пример класса, который я написал. Все это работает автономно и печатает число от 1 до 100 каждое из ThreadPool. Практически все, что вам нужно сделать, это обновить класс Request, чтобы передать то, что вы хотите, и повторно реализовать ImageProcessor.
package com.rch.test;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
public class Executor
{
/**
* Class to encapsulate a request
*
* @author romain
*/
static class Request
{
String someText;
Request(String someText)
{
this.someText = someText;
}
public String getSomeText()
{
return someText;
}
}
/**
* Creates a Thread that listens on a queue to process messages
*
* @author romain
*/
static class ServerThread implements Runnable
{
private BlockingQueue<Request> queue = new LinkedBlockingQueue<Request>();
boolean stop = false;
/**
* Does all the work
*/
@Override
public void run()
{
ExecutorService pool = Executors.newFixedThreadPool(3);
try
{
while (!stop)
{
Request req = queue.poll(1000L, TimeUnit.MILLISECONDS);
if (req != null)
{
Runnable runnable = new Executor.ImageProcessor(req);
pool.execute(runnable);
}
}
}
catch (InterruptedException ie)
{
System.out.println("Log something here");
}
finally
{
pool.shutdown();
}
}
/**
* Accepts a message on the queue
* @param request
*/
public void accept(Request request)
{
queue.add(request);
}
public void stopProcessing()
{
stop = true;
}
}
/**
* class to do the actual work
* @author romain
*/
static class ImageProcessor implements Runnable
{
String someText;
ImageProcessor(Request req)
{
this.someText = req.getSomeText();
}
@Override
public void run()
{
System.out.println(someText);
// Process Image here
}
}
/**
* Test Harness
* @param args
*/
public static void main(String[] args)
{
// Initialize
ServerThread processor = new ServerThread();
Thread aThread = new Thread(processor);
aThread.start();
// Wait for Thread to start
try
{
Thread.sleep(500L);
}
catch (InterruptedException e1)
{
e1.printStackTrace();
}
for (int i = 0; i < 100; i++)
{
String text = "" + i;
Request aRequest = new Request(text);
processor.accept(aRequest);
}
// Give it enough time to finish
try
{
Thread.sleep(500L);
}
catch (InterruptedException e1)
{
e1.printStackTrace();
}
// Tell the thread to finish processing
processor.stopProcessing();
// Wait for the Thread to complete
try
{
aThread.join();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
Вы можете рассматривать каждую операцию обработки как «задачу». Поместите эти задачи в одну очередь, и пусть каждый поток будет использовать задачу из этого потока каждый раз, когда они завершают задачу.
Sun's tutorials действительно хороши, поэтому я просто размещу ссылку Defining and Starting a Thread
Цитата: Потоки иногда называют облегченными процессами. И процессы, и потоки обеспечивают среду выполнения, но создание нового потока требует меньше ресурсов, чем создание нового процесса. Нити существуют внутри процесса - каждый процесс имеет хотя бы одну нить. Нити совместно используют ресурсы процесса, включая память и открытые файлы. Это обеспечивает эффективное, но потенциально проблематичное взаимодействие.
while(que is not empty)
start new set of image-processing-thread