题目
编写一个有两个线程的程序,第一个线程用来计算2~100000之间的素数的个数,第二个线程用来计算100000~200000之间的素数的个数,最后输出结果。
结果
2 到 100000 有 9592 个素数;
100001 到 200000 有 8392 个素数。
想法
因为是目的是学习简单的多线程编程,所以暂时先使用暴力方法来查找素数,并且使用Runnable接口,实现run()方法来达到要求。
代码
SearchThread 类
public class SearchThread implements Runnable {
private int count;
private int startNum; //确定寻找范围的左边界
private int endNum; //确定寻找范围的右边界
public SearchThread(int startNum, int endNum) {
this.startNum = startNum;
this.endNum = endNum;
count = endNum - startNum + 1;
}
public void run() {
//暴力查找
for (int i = startNum; i <= endNum; i++) {
for (int j = 2; j <= i; j++) {
if (i % j == 0 && i != j) {
count--;
break;
} else {
// do nothing
}
} // end for(j)
} // end for(i)
System.out.println(startNum + " to " + endNum + " has " + count);
}
}
SearchPrimeNumber 类
public class SearchPrimeNumber {
public static void main(String[] agrs) throws InterruptedException {
// 创建两个线程进行查找
SearchThread threadA = new SearchThread(2, 100000);
SearchThread threadB = new SearchThread(100001, 200000);
Thread a = new Thread(threadA);
Thread b = new Thread(threadB);
a.start();
b.start();
Thread.sleep(5000);
System.out.println("Done!");
System.exit(0);
}
}
输出
2 to 100000 has 9592
100001 to 200000 has 8392
Done!
问题
暴力查找的时间损耗很长,最后的结果可能无法显示,需要添加一个sleep()方法才能正常,这是为什么?
解决
问题出在最后的System.exit()方法上,exit方法会使整个进程退出,不管线程是否结束。因此只需要将这句话删除即可。像这样:
public static void main(String[] agrs) throws InterruptedException {
// 创建两个线程进行查找
SearchThread threadA = new SearchThread(2, 100000);
SearchThread threadB = new SearchThread(100001, 200000);
Thread a = new Thread(threadA);
Thread b = new Thread(threadB);
a.start();
b.start();
}
其他
在Java中所有的线程都是平级关系,主线程的退出不会影响到其他线程;
sleep方法属于Thread的静态方法,直接用类名调用即可。