J'ai quelques questions liées au thread, en supposant le code suivant. S'il vous plaît ignorer l'inefficacité possible du code, je suis seulement intéressé par la partie thread.comparaison de la performance du code, threaded contre non-threaded
//code without thread use
public static int getNextPrime(int from) {
int nextPrime = from+1;
boolean superPrime = false;
while(!superPrime) {
boolean prime = true;
for(int i = 2;i < nextPrime;i++) {
if(nextPrime % i == 0) {
prime = false;
}
}
if(prime) {
superPrime = true;
} else {
nextPrime++;
}
}
return nextPrime;
}
public static void main(String[] args) {
int primeStart = 5;
ArrayList list = new ArrayList();
for(int i = 0;i < 10000;i++) {
list.add(primeStart);
primeStart = getNextPrime(primeStart);
}
}
Si je cours le code comme ceci et cela prend environ 56 secondes. Si, cependant, j'ai le code suivant (comme une alternative):
public class PrimeRunnable implements Runnable {
private int from;
private int lastPrime;
public PrimeRunnable(int from) {
this.from = from;
}
public boolean isPrime(int number) {
for(int i = 2;i < from;i++) {
if((number % i) == 0) {
return false;
}
}
lastPrime = number;
return true;
}
public int getLastPrime() {
return lastPrime;
}
public void run() {
while(!isPrime(++from))
;
}
}
public static void main(String[] args) {
int primeStart = 5;
ArrayList list = new ArrayList();
for(int i = 0;i < 10000;i++) {
PrimeRunnable pr = new PrimeRunnable(primeStart);
Thread t = new Thread(pr);
t.start();
t.join();
primeStart = pr.getLastPrime();
list.add(primeStart);
}
}
L'opération entière prend environ 7 secondes. Je suis presque certain que même si je ne crée qu'un seul fil à la fois, un fil ne finit pas toujours quand un autre est créé. Est-ce correct? Je suis aussi curieux: pourquoi l'opération se termine-t-elle si vite?
Lorsque je rejoins un thread, d'autres threads continuent-ils à s'exécuter en arrière-plan ou le thread connecté est-il le seul en cours d'exécution?
Bon exemple! Je vous remercie ! – Geo
+1: Génial, très utile. – sixtyfootersdude