任务数量可变的多线程

时间:2019-04-27 23:46:08

标签: java multithreading

我有一堂课,需要尽快计算n任务(最多625个)。因此,我想利用多线程,以便并行运行这些计算。经过研究,我发现了fork / join框架,但无法弄清楚如何实现。

例如,让某个类Foo(将在其他地方用作对象)带有一些方法和变量:

public class Foo {
  int n;
  int[][] fooArray;
  public Foo(int x) {
    n = x;
    fooArray = new int[n][];
  }
  public void fooFunction(int x, int y) {
    //Assume (n > x >= 0).
    fooArray[x] = new int[y];
  }
  //Implement multithreading here.
}

我读了一个基本的tutorial on the Java documentation,它使用ForkJoinPool将任务分为两部分,并使用递归将它们传递给invokeAll方法。理想情况下,我想做类似的事情,除了将其实现为Foo的子类并将任务(在这种情况下,运行fooFunction)分成n个部分。我该怎么做?

1 个答案:

答案 0 :(得分:0)

经过数天的反复试验,我终于想出了自己的方法:

让某个类foo需要一些需要并行执行的相似(如果不相同)任务的事物。让某个数字n代表该任务应运行的次数,其中n大于零且小于您可以创建的最大线程数。

public class foo {

  //do normal class stuff.

  public void fooFunction(int n) {
    //do normal function things.

    executeThreads(n);
  }

  public void executeThreads(int n) throws InterruptedException {

    ExecutorService exec = Executors.newFixedThreadPool(n);
    List<Callable<Object>> tasks = new ArrayList<Callable<Object>>();

    for(int i = 0; i < n; i++)
        tasks.add(Executors.callable(new Task(i)));

    exec.invokeAll(tasks);
    exec.shutdown();
  }

  public class Task implements Runnable {

    int taskNumber;

    public Task(int i) {

      taskNumber = i;

    }

    public void run() {
      try {
        //this gets run in a thread

        System.out.println("Thread number " + taskNumber);

      } catch (Exception e) {
        e.printStackTrace();
      }
    }

  }

}

这几乎肯定不是最有效的方法,它为需要完成的每个任务创建一个线程。换句话说,这不是线程池。确保不要创建太多线程,并且任务足够大以证明可以并行运行它们。如果有更好的选择,请发布答案。