zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    队列
    生物信息 perl 脚本实战
    Linux 命令速查
    perl 语法速查 | 模块安装
    Falcon Genome Assembly Tool Kit Manual
    Falcon:三代reads比对组装工具箱
    白话经典算法系列
    八大排序算法
    七大查找算法(附C语言代码实现)
    samtools常用命令详解(转)
  • 原文地址:https://www.cnblogs.com/ciscolee/p/13033768.html
Copyright © 2011-2022 走看看