我有一堂课,需要尽快计算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
个部分。我该怎么做?
答案 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();
}
}
}
}
这几乎肯定不是最有效的方法,它为需要完成的每个任务创建一个线程。换句话说,这不是线程池。确保不要创建太多线程,并且任务足够大以证明可以并行运行它们。如果有更好的选择,请发布答案。