原创

整数内の大きな配列文字の最小値/最大値を検索するマルチスレッド プログラムでの予期しない動作。彼らは何ですか?長い浮動小数点数の出力には文字が表示されます

温馨提示:
本文最后更新于 2024年04月12日,已超过 47 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

研究のために、使用するスレッドの数に応じて、配列内の最大値と値を検索するプログラムの実行時間測定プログラムを作成しました。簡単に比較できる結果を得るには、コンピューターが処理できる最大の配列が必要です。配列が 10k 程度になるまではすべて機能しているように見えますが、それ以降は最大値と最小値が変化し、その理由が分かりません。なぜなら、問題は最小の数値であるようです。

これが私のメインクラスです:

import java.util.Random;

public class Start {

    final static double[] ARRAY = new double[10000];
    final static int THREADS = 10;

    static double maxOut = Double.MIN_VALUE;
    static double minOut = Double.MAX_VALUE;
    final static int PLACEMENT = ARRAY.length/THREADS;

    public static void main(String[] args) {

        Random random = new Random();

        long generatingStart=System.nanoTime();
        for (int i = 0 ;i < ARRAY.length; i++){
            ARRAY[i] = random.nextDouble();
            //System.out.println(ARRAY[i]);
        }
        System.out.println("Czas generowania: " + ((System.nanoTime() - generatingStart) * 0.000001 )+"ms");

        Runnable [] watki = new Watek[THREADS];

        for(int i = 0; i< THREADS; i++){

            if(i == 0){
                watki[i] = new Watek(ARRAY, PLACEMENT, 0);
                //System.out.println("Watek "+i+" Zakres: "+0+" --> "+ PLACEMENT);
            }
            else if (i == THREADS - 1) {
                watki[i] = new Watek(ARRAY, ARRAY.length,i * PLACEMENT);
                //System.out.println("Watek "+i+" Zakres: "+i * PLACEMENT+" --> "+ ARRAY.length);
            }
            else {
                watki[i] = new Watek(ARRAY, (i+1) * PLACEMENT, i * PLACEMENT);
                //System.out.println("Watek "+i+" Zakres: "+i*PLACEMENT+" --> "+(i+1)*PLACEMENT);
            }
        }

        Thread[] threads = new Thread[THREADS];

        long startTime = System.nanoTime();

        for (int i = 0; i < THREADS; i++) {
            threads[i] = new Thread(watki[i]);
            threads[i].start();
        }

        for (Thread thread : threads) {
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        double duration = (System.nanoTime() - startTime) * 0.000001;

        for (int i = 0; i < THREADS; i++) {
            //System.out.println("Thread " + i + " - Max: " + ((Watek) watki[i]).getMax() + " Min: " + ((Watek) watki[i]).getMin());
            if (( ((Watek) watki[i]).getMax()) > maxOut) {
                maxOut = ((Watek) watki[i]).getMax();
            }if (( ((Watek) watki[i]).getMin()) < minOut) {
                minOut = ((Watek) watki[i]).getMin();
            }
        }
        System.out.println("Maksymalna wartość w tablicy to: " + maxOut + ",natomiast minimalna to: "+minOut);
        System.out.println("Czas trawnia programu to: " + duration + "ms");
    }

}

そして、これが私のスレッドコードです:

public class Watek implements Runnable {

    double[] arr;

    int maxBound;
    int minBound;
    double max;
    double min;


    public Watek(double[] arr, int maxBound, int minBound){
        this.arr = arr;
        this.maxBound = maxBound;
        this.minBound = minBound;
    }

    public double getMax() {
        return max;
    }

    public double getMin() {
        return min;
    }

    @Override
    public void run() {
        try {

            this.max = Double.MIN_VALUE;
            this.min = Double.MAX_VALUE;
            for (int i = minBound; i < maxBound; i++) {
                if (arr[i] > max) {
                    max = arr[i];
                }if (arr[i] < min) {
                    min = arr[i];
                }
            }
        } catch (Exception exception){
            exception.printStackTrace();
        }
    }
}

再実行の 1 つでは、次の出力が表示されます: max = 0.9998978620408705、min = 3.056044805038738E-5

最初は、このプログラムを Integer 値用に書き、次に Double 値用に調整しました。整数ではすべてが期待通りに機能します。 。

正文到此结束
热门推荐
本文目录