我有一些線程相關的問題,假設下面的代碼。請忽略代碼可能的低效率,我只對線程部分感興趣。代碼性能比較,線程與非線程
//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);
}
}
如果我正在運行這樣的代碼,它大約需要56秒。但是,如果我有以下代碼(作爲替代):
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);
}
}
整個操作大約需要7秒。我幾乎可以肯定的是,即使我一次只創建一個線程,但創建另一個線程時線程並不總是完成。是對的嗎?我也很好奇:爲什麼這個行動結束得這麼快?
當我加入一個線程時,其他線程是否繼續在後臺運行,或者是連接的線程是唯一正在運行的線程?
您能否告訴我您的意思是「這兩起案件都沒有做同樣的事情」? – Geo 2008-10-29 21:20:39
其中一種情況比較慢的原因是它沒有做同樣的事情。提示:您分別調用isPrime()和getNextPrime()多少次? – JesperE 2008-10-29 21:34:01