我有一些线程相关的问题,假设下面的代码。请忽略代码可能的低效率,我只对线程部分感兴趣。代码性能比较,线程与非线程
//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