【发布时间】:2011-11-20 04:16:30
【问题描述】:
我正在尝试在 Java 上编写一个多线程版本的 shell 排序
这是单线程版本的代码
import java.util.*;
import java.util.Scanner.*;
class Test
{
public static void main (String [] args)
{
double [] list = new double [10000];
for (int i = 0; i < 10000; i++)
list[i] = 10000 - i;
long startTime = System.currentTimeMillis();
shellSort(list);
int elapsedTime = (int) (System.currentTimeMillis() - startTime);
System.out.println ("Time = " + elapsedTime);
for (double i : list)
System.out.print (i + " ");
}
public static void shellSort(double [] list)
{
int i, increment;
int [] k = {1, 4, 13, 40, 121, 364, 1093, 3280, 9841, 29524, 88573, 265720, 797161, 2391484};
for (i = k.length - 1; k[i] > list.length; i--);
for (i--; i >= 0; i--)
{
increment = k[i];
int upper = 2 * increment;
for (int count = increment; count < upper; count++)
insertionSort(list, increment, count);
}
}
public static void insertionSort(double [] list, int increment, int position)
{
for (int top = position; top < list.length;)
{
double item = list[top];
int i = top;
while (i - increment >= 0 && item < list[i - increment])
{
list[i] = list[i - increment];
i -= increment;
}
list[i] = item;
top += increment;
}
}
}
这是多线程版本的代码
import java.util.*;
import java.util.Scanner.*;
class MT extends Thread
{
double[] list;
int increment, position;
MT (double [] a, int b, int c)
{
list = a;
increment = b;
position = c;
}
public void run()
{
for (int top = position; top < list.length;)
{
double item = list[top];
int i = top;
while (i - increment >= 0 && item < list[i - increment])
{
list[i] = list[i - increment];
i -= increment;
}
list[i] = item;
top += increment;
}
}
}
class Test
{
public static void main (String [] args)
{
double [] list = new double [10000];
for (int i = 0; i < 10000; i++)
list[i] = 10000 - i;
long startTime = System.currentTimeMillis();
shellSort(list);
int elapsedTime = (int) (System.currentTimeMillis() - startTime);
System.out.println ("Time = " + elapsedTime);
for (double i : list)
System.out.print (i + " ");
}
public static void shellSort(double [] list)
{
int i, increment;
int [] k = {1, 4, 13, 40, 121, 364, 1093, 3280, 9841, 29524, 88573, 265720, 797161, 2391484};
for (i = k.length - 1; k[i] > list.length; i--);
for (i--; i >= 0; i--)
{
increment = k[i];
int upper = 2 * increment;
for (int count = increment; count < upper; count+=2)
{
new MT(list, increment, count).start();
new MT(list, increment, count + 1).start();
}
}
}
}
多线程版本比单线程版本花费的时间要长得多。两者都给出了正确的输出,并且多线程版本使用了我的 3 个内核,而不是预期的 2 个。是什么导致我的多线程程序速度变慢?我唯一能想到的是,每当我调用 MT 类时,我都在创建包含数字的数组?
谢谢。
【问题讨论】:
-
shellsort 算法不是特别适合并行化,因为需要大量的同步/线程开销。
标签: java multithreading