以下code尝试并行化Fibonacci数问题。如何修改这些线程以限制线程数。
据我所知,Fibonacci不是线程的自然候选者。但是想知道如何使用线程进行优化。
public class Fib extends Thread
{
private int x;
public int answer;
public Fib(int x) {
this.x = x;
}
public void run() {
if( x <= 2 )
answer = 1;
else {
try {
Fib f1 = new Fib(x-1);
Fib f2 = new Fib(x-2);
f1.start();
f2.start();
f1.join();
f2.join();
answer = f1.answer + f2.answer;
}
catch(InterruptedException ex) { }
}
}
public static void main(String[] args)
throws Exception
{
try {
Fib f = new Fib( Integer.parseInt(args[0]) );
f.start();
f.join();
System.out.println(f.answer);
}
catch(Exception e) {
System.out.println("usage: java Fib NUMBER");
}
}
}
答案 0 :(得分:2)
将每次调用fib()分支为两个调用是低效的 - 斐波那契数列的计算应该在线性时间内完成。请参阅this question的答案。
那就是说,如果你仍然想要使用线程,那么记忆和/或使用未来的结果是必不可少的。
答案 1 :(得分:0)
您可以为包含当前线程数/线程轮询或smt else的线程创建一些工厂。这个工厂的主要问题是 - 线程创建。
答案 2 :(得分:0)
Fibonacci是创建大量线程的常见示例,因为它易于理解和实现,这使得它对家庭作业有益,但应该注意的是,这也许是使用一个线程比尝试使用更快的最佳示例多线程。它的一个坏主意是因为拥有许多线程的开销与指数增长的结果成正比。
简而言之,最佳线程数是1。一旦你知道,你的代码将变得更加简单。
如果要优化代码,则应该从循环中的第一个值开始构建值。即从1,1,2,3,5,8开始...这也会减少你指数级的通话次数。