java多线程计算pi_java多线程实现数学计算,得到结果

根据设计,以及实验结果,真正理解线程的机制:

先上代码:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.math;//数学计算的各种方法

public classMathCal {//1、多线程计算(1*2)/(1+2)类型问题,首先,一个线程类run方法计算 1*2,一个类的run方法计算1+2,,在本类中的main中计算除

public static voidmain(String[] args) {

Add t1= newAdd();

Mul t2= newMul();

t1.start();

t2.start();try{

t1.join();

t2.join();

}catch(Exception e) {//TODO: handle exception

}double n = ((double)t2.value/t1.value);

System.out.println("主线程,得到相除结果:"+n);

}

}class Add extendsThread{intvalue;public voidrun() {//TODO Auto-generated method stub

System.out.println("正在执行加法...");

value= 1+2;

System.out.println("加法执行结果:"+value);

}

}class Mul extendsThread{intvalue;public voidrun() {//TODO Auto-generated method stub

System.out.println("正在执行乘法...");

value= 1*2;

System.out.println("乘法执行结果:"+value);

}

}

View Code

观察代码,不难看出,如果是按照正常的程序理解,不以线程情况去理解,打印出的结果应该是:

正在执行加法...

加法执行结果:3

正在执行乘法...

乘法执行结果:2

主线程,得到相除结果:0.6666666666666666

然而实际使用线程后,打印的结果却是:

正在执行加法...

正在执行乘法...

加法执行结果:3

乘法执行结果:2

主线程,得到相除结果:0.6666666666666666

好了,这是什么原因呢?难道是因为try那里的join方法,我们再次实验,发现结果打出来的竟然是NaN,why?为什么呢?

我们给main方法所在类加一句不含计算及结果的打印,又会怎样呢?

结果在有join方法的时候,结果会与我们的main方法中的调用情况相同,但在去掉之后,却发现计算语句竟然是main中的先执行。

可见:

join方法有助于我们控制线程的执行。让我们 按照自己的意愿执行。而在没有join方法的时候,程序会优先执行非计算语句,顺序是按照先执行main,

再执行按照main方法中调用的顺序,最后再计算,而计算的情况也一样,优先执行 main中的计算,所以在没有加入join控制的情况下,结果自然是NaN。至于打印为什么是最后,我想他应该是进入等待队列了,待其他两个线程类按照顺序打印后,再打印。

故打印是按照main内调用顺序,然而程序内部却是优先main,再其他。所以join的作用就体现出来了。

总结:join方法有助于我们将大问题细化为不同的小问题,先使他们各自计算,再使用join将main进入等待状态,各个计算结果就能被main使用了。

即join是在要使用别人的类中的方法使用。

真的是这样吗?真的是这样吗?我们的猜测正确吗?现在,我们使用debug断点调试测试一下就知道了。

我没有使用main方法来调用他们,重新使用一个方法来调用,而main方法调用的是调用这个新的方法,结论与上面一致,但在使用debug调试后,竟然在不加join的情况下,可以得到正确的结果。这到底又是什么原因呢?最后,我发现竟然是因为我在上一次的调试之中在debug模式的断点调试中的condition中加入了关于加法value==3和乘法value==2的条件导致的。

所以综上,猜测正确,结论正确。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值