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

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

先上代码:

package com.math;


//数学计算的各种方法
public class MathCal {
    //1、多线程计算(1*2)/(1+2)类型问题,首先,一个线程类run方法计算 1*2,一个类的run方法计算1+2,,在本类中的main中计算除
    public static void main(String[] args) {
        Add t1 = new Add();
        Mul t2 = new Mul();
        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 extends Thread{
    int value;
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("正在执行加法...");
        value = 1+2;
        System.out.println("加法执行结果:"+value);
    }
    
}

class Mul extends Thread{
    int value;
    public void run() {
        // 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的条件导致的。

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

 【关于断点调试:https://www.cnblogs.com/df-xfz/p/5653545.html

posted @ 2020-06-02 21:13  CiscoLee  阅读(626)  评论(0编辑  收藏  举报