众所周知,多线程是Java语言最重要的特性之一。一个程序在其执行过程中,可以产生多个线程,形成多条执行线索。每条线程,有产生、存在和消亡的过程。程序中多个线程,按照自己的执行路线并发工作,独立完成各自的功能,互不干扰。多线程的执行也是以划分CPU时间片为主要方式的,每个线程会再执行期间被分到单独的一个时间片,在此期间其他的应用程序休眠等待,可以说多线程极大地提高了程序运行的效率,是java开发大型程序必不可少的一道机制。
下面这个例子就是用多线程实现的一个算数小例子。
package Summation;
//求完数的线程
public class PerfectThread extends Thread{
int i, j, count, n; //静态变量n是最终结果,在主类中调用
//构造方法,主类里输入最大值10000
public PerfectThread(int n) {
this.count = n;
}
//重写run方法,内容是求count以内的完数之和
public void run() {
for(i=2; i<count; i++) {
int sum=0; //sum是因子之和,i是扫描的每一个数
for(j=1; j<i; j++) {
if(i%j==0) { //可以整除说明是因子,加到sum中
sum+=j;
}
}
if(sum==i) { //如果因子之和等于这个数,就加到n中,n为目前所加起来的完数之和
n+=sum;
}
}
}
}
package Summation;
//求素数的线程
public class PrimeThread extends Thread{
int i, j, sum=0; //变量s是最终结果,在主类中调用
int count; //count是在主类中输入的上限10000
//构造方法
public PrimeThread(int m) {
this.count = m;
}
//重写run方法求素数之和
public void run() {
for(i=2; i<count; i++) { //从2开始作为被除数,1不是素数
for(j=2; j<i; j++) { //从2开始到i作为除数
if(i%j==0){ //如果可以整除说明不是素数跳出循环继续扫描下一个i
break;
}
}
if(j==i) { //如果内层循环结束跳出的循环就说明是素数加到sum里
sum+=i;
}
}
}
}
package Summation;
import java.math.*;
public class Textsum {
public static void main(String[] args) throws InterruptedException {
PrimeThread t1 = new PrimeThread(10000); //定义素数和对象10000之内
PerfectThread t2 = new PerfectThread(10000); //定义完数和对象10000之内
//启动两个线程
t1.start();
t2.start();
//等待两个线程全部死亡(结束)
t1.join();
t2.join();
//将两个线程中的两个int型和数转化为大数类
BigDecimal sum1 = BigDecimal.valueOf((int)t1.sum);
BigDecimal sum2 = BigDecimal.valueOf((int)t2.n);
//定义一个大数类对象引用作为最终结果
BigDecimal total = new BigDecimal(0);
//两个和数相乘,输出结果
total = sum1.multiply(sum2);
System.out.println("10000以内素数和完数之和的乘积为:"+ total);
}
}