public class Fibonacci {
public static class PFibo extends Thread {
private int x;
public long answer;
public PFibo(int x) {
this.x = x;
}
public void run() {
if (x <= 2)
answer = 1;
else {
try {
PFibo t = new PFibo(x - 1);
t.start();
long y = RFibo(x - 2);
t.join();
answer = t.answer + y;
} catch (InterruptedException ex) {
}
}
}
}
public static long RFibo(int no) {
if (no == 1 || no == 2) {
return 1;
}
return RFibo(no - 1) + RFibo(no - 2);
}
public static void main(String[] args) throws Exception {
try {
long start = System.currentTimeMillis();
PFibo f = new PFibo(30);
f.start();
f.join();
long end = System.currentTimeMillis();
System.out.println("Parallel-Fibonacci:" + f.answer + "\tTime:" + (end - start));
start = System.currentTimeMillis();
long result = RFibo(30);
end = System.currentTimeMillis();
System.out.println("Normal-Fibonacci:" + result + "\tTime:" + (end - start));
} catch (Exception e) {
}
}
Je lis actuellement 'multithread algorithmes' de 'Introduction aux algorithmes'. J'ai essayé d'implémenter un programme multithread de base pour calculer le n-ème nombre de fibonacci. Pour n = 30, le programme a donné le résultat suivant:
Parallel-Fibonacci:832040 Time:10
Normal-Fibonacci:832040 Time:3
Pourquoi la version parallèle, plus lent que la version non-parallèle. Est-ce que le thread-switching ou 'too-many-number-of-threads' l'a ralenti?
Quelle approche faut-il suivre pour accélérer la version parallèle?
Vous semblez créer un nouveau fil à chaque boucle. Ça va vous coûter cher. – Carcigenicate
Aussi, puisque Fibonacci est une * séquence * cela n'a pas vraiment de sens de le multi-threader. Chaque valeur dépend des précédentes. –