Обработка изображений в multhithreaded режиме с помощью Java

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

Я просто застреваю о том, как сделать это, я взглянул ThreadExecutor и BlockingQueues и т.д... Я все еще не ясен. То, что я делаю, - Получают изображения и добавляют их в LinkedBlockingQueue, который имеет выполнимый код процессора изображения. - Создают threadpoolexecutor, для которого одним из arguements является LinkedBlockingQueue ранее. - Выполняют итерации через для цикла до размера очереди и делают threadpoolexecutor.execute (linkedblockingqueue.poll). - все, что я вижу, является этим, обрабатывает только 100 изображений, который является минимальным размером потока, переданным в размере LinkedBlockingQueue.

Я вижу, что я серьезно неправ в своем понимании где-нибудь, как я обрабатываю все изображения в наборах 100 (потоки), пока они все не сделаны? Любые примеры или psuedocodes были бы очень полезны

Спасибо! J

1
задан skaffman 18 June 2010 в 08:53
поделиться

3 ответа

Вот пример класса, который я написал. Все это работает автономно и печатает число от 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();
        }
    }
}
2
ответ дан 2 September 2019 в 23:41
поделиться

Вы можете рассматривать каждую операцию обработки как «задачу». Поместите эти задачи в одну очередь, и пусть каждый поток будет использовать задачу из этого потока каждый раз, когда они завершают задачу.

0
ответ дан 2 September 2019 в 23:41
поделиться

Sun's tutorials действительно хороши, поэтому я просто размещу ссылку Defining and Starting a Thread

Цитата: Потоки иногда называют облегченными процессами. И процессы, и потоки обеспечивают среду выполнения, но создание нового потока требует меньше ресурсов, чем создание нового процесса. Нити существуют внутри процесса - каждый процесс имеет хотя бы одну нить. Нити совместно используют ресурсы процесса, включая память и открытые файлы. Это обеспечивает эффективное, но потенциально проблематичное взаимодействие.

while(que is not empty)
  start new set of image-processing-thread
0
ответ дан 2 September 2019 в 23:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: