我一直在尝试用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:通过使用线程类,程序会执行多线程操作吗?或者它只是一种冗长的再次调用函数的方式。
2条答案
按热度按时间svgewumm1#
您的线程尚未启动。如果调用
.start()
方法,则您的线程将启动,并执行.run()
方法的内容。由于.run()
方法为空,因此您的线程将是短暂的。您需要像这样重构线程并且,不是直接调用
.doSort()
,而是将Multi
对象存储到一个变量中,如下所示:然后调用
multiLeft.start();
和multiRight.start();
。在分别调用multiLeft.getResult()
和multiRight.getResult()
之前,不要忘记.join()
。v9tzhpje2#
这是一种冗长的再次调用相同函数的方法。要创建线程,您需要创建一个
Thread
对象并调用其内置的start
方法。start
创建一个新线程,新线程调用run
方法,您可以将代码放在同一个对象中。对于Runnable
,还有一种稍微不同的方法。只有
start
方法启动一个新线程。其他方法只是一个方法。