Как реализовать forkjoin для серии действий, которые сейчас выполняются в цикле for - PullRequest
2 голосов
/ 27 октября 2011

У меня есть список отправителей, для которых я должен параллельно отправлять письма индивидуально. В настоящее время я перебираю список, создаю тело (как оно отличается для разных людей) и затем отправляю их.Как я могу использовать forkjoin для этого.Я пытался использовать recusiveAction, но я думаю, что это только для рекурсивных задач.

Все примеры, доступные в интернете, реализованы с помощью RecursiveAction.Есть ли другой класс, с помощью которого я могу реализовать это.

Ответы [ 2 ]

1 голос
/ 29 октября 2011

ServiceExecutors хорошо работают для этого. Они приходят с Java.

import java.util.*;
import java.util.concurrent.*;

public class SendMailExample
{
  public static void main(String[] args) throws Exception
  {
    ExecutorService executor = Executors.newFixedThreadPool(3);

    Collection<Future> futures = new ArrayList<Future>();
    futures.add(executor.submit(new Mailer("thread1")));
    futures.add(executor.submit(new Mailer("thread2")));
    futures.add(executor.submit(new Mailer("thread3")));

    for (Future future : futures)
    {
      future.get();
    }
    executor.shutdown();
  }

  static class Mailer implements Runnable
  {
    private Object message;

    public Mailer(Object message)
    {
      this.message = message;
    }

    public void run()
    {
      System.out.println("Sending message " + String.valueOf(message));
    }
  }
}
0 голосов
/ 31 октября 2011

Я просмотрел, я получил лучший ответ:

package Test1;

import java.util.*;
import java.util.concurrent.*;
import static java.util.Arrays.asList;

public class Sums
{
    static class Sum implements Callable<Long>
    {
        private final long from;
        private final long to;
        Sum(long from, long to)
        {
            this.from = from;
            this.to = to;
        }

        @Override
        public Long call()
        {
            long acc = 0;
            if(from == 0)
            {
                try
                {
                    Thread.sleep(5000);
                }
                catch (InterruptedException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            System.out.println(from);
            for (long i = from; i <= to; i++)
            {
                acc = acc + i;
            }
            return acc;
        }                
    }

    public static void main(String[] args) throws Exception
    {
        ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
        List <Future<Long>> results = executor.invokeAll(asList(
        new Sum(0, 10), new Sum(100, 1000), new Sum(10000, 1000000)
        ));
        executor.shutdown();

        for (Future<Long> result : results)
        {
            System.out.println(result.get());
        }
    }    
}

С помощью этого кода вы сможете получить ответ, а также любые выданные исключения.

...