java 如何查看我的代码是否真正使用了多线程?

ilmyapht  于 2023-03-28  发布在  Java
关注(0)|答案(2)|浏览(250)

我一直在尝试用Java写一个合并排序算法来利用多线程,我正在努力看看我的代码是否真正利用了多线程,或者我只是顺序地制作线程对象,然后运行递归合并排序调用?
合并排序如下:

public class Sort {

    public int[] mergeSort(int[] myItems) {

        Splice splicer = new Splice();

        if (myItems.length < 2) {
            return myItems;
        }

        int mid = myItems.length / 2;

        //splits the load of each recursive call to different threads to run at the same time
        int[] left = new Multi(splicer.splice(myItems, 0, mid-1)).doSort();
        int[] right = new Multi(splicer.splice(myItems, mid, myItems.length -1)).doSort();
        
        ...
        return myItems
   }
}

线程的类是:

public class Multi extends Thread {

    Sort merge = new Sort();
    private int[] myItems;

    public Multi(int[] myItems) {
        this.myItems = myItems;
    }

    public void run() {
    }

    public int[] doSort() {
        return merge.mergeSort(myItems);
    }

}

(splice是我做的一个函数,它接受数组、起始索引和最终索引,并将给定范围内的元素作为一个新数组输出)
TLDR:通过使用线程类,程序会执行多线程操作吗?或者它只是一种冗长的再次调用函数的方式。

svgewumm

svgewumm1#

您的线程尚未启动。如果调用.start()方法,则您的线程将启动,并执行.run()方法的内容。由于.run()方法为空,因此您的线程将是短暂的。您需要像这样重构线程

public class Multi extends Thread {

    Sort merge = new Sort();
    private int[] myItems;
    protected int[] result;

    public Multi(int[] myItems) {
        this.myItems = myItems;
    }

    public void run() {
        result = doSort();
    }

    public void doSort() {
        return merge.mergeSort(myItems);
    }

    public int[] getResult() {
        return result;
    }

}

并且,不是直接调用.doSort(),而是将Multi对象存储到一个变量中,如下所示:

Multi multiLeft = new Multi(splicer.splice(myItems, 0, mid-1));
Multi multiRight = new Multi(splicer.splice(myItems, mid, myItems.length -1));

然后调用multiLeft.start();multiRight.start();。在分别调用multiLeft.getResult()multiRight.getResult()之前,不要忘记.join()

v9tzhpje

v9tzhpje2#

这是一种冗长的再次调用相同函数的方法。要创建线程,您需要创建一个Thread对象并调用其内置的start方法。start创建一个新线程,新线程调用run方法,您可以将代码放在同一个对象中。对于Runnable,还有一种稍微不同的方法。
只有start方法启动一个新线程。其他方法只是一个方法。

相关问题