【发布时间】:2019-05-06 22:46:51
【问题描述】:
我正在研究一种排序算法来显示名为 BITONIC 的多线程执行,但我发现使用 multhread 运行它的方式是创建新对象并在静态数组中工作,但这导致我的排序速度非常慢,通过一些调试 - 阅读打印 - 我发现我正在创建滥用数量的线程,因此创建了大量的对象,我认为是它让它变得如此缓慢,但我无法真正修复问题,所以如果你能给我一些建议,我将非常感激。
双调排序类似于merge,对算法的真正理解并不是真正需要的,只需要线程和java方面的知识
这里我有一些个人线程的属性
public static int[] data;
private int start, end, size;
private boolean direction;
private int minimumLength = 1;
private final boolean Ascending = true, Descending = false;
我有 2 个构造函数,一个用于第一个实例,它们将从外部分配的向量中设置值
public MultiThreadedSorter (int[] originalData)
{
data = originalData;
start = 0;
end = size = data.length;
direction = Ascending;
// minimumLength = data.length / Runtime.getRuntime().availableProcessors();
minimumLength = 2;
}
另一个用于递归除法,每个线程都有新值
private MultiThreadedSorter (int lo, int hi, boolean dir)
{
start = lo;
end = hi;
size = hi-lo;
direction = dir;
}
仅用于封装目的的排序
public void Sort()
throws InterruptedException
{
BitonicSort(start, end, direction);
}
这里是运行覆盖
@Override
public void run()
{
try
{
BitonicSort(start, end, direction);
} catch (InterruptedException ex)
{
Logger.getLogger(MultiThreadedSorter.class.getName()).log(Level.SEVERE, null, ex);
}
}
我认为问题出在此处
private void BitonicSort(int _lo, int _hi, boolean dir)
throws InterruptedException // join()
{
int length = _hi - _lo;
// System.out.println(Thread.currentThread().getName() + " - CRIADA");
// System.out.printf("%d\t%d\n", _lo, _hi);
if (length > 1)
{
// Show ("SORT", true);
if (length > minimumLength)
{
int mid = length / 2;
System.out.println("-- left - " + Thread.currentThread().getName());
MultiThreadedSorter leftSorterObj = new MultiThreadedSorter(_lo, _lo+mid, Ascending);
Thread left = new Thread(leftSorterObj);
left.start(); // i think that the problem is here
left.join(); // or here
System.out.println("-- rigth - " + Thread.currentThread().getName());
// System.out.printf("%d\t%d\n", _lo+mid, _hi);
MultiThreadedSorter rightSorterObj = new MultiThreadedSorter(_lo+mid, _hi, Descending);
Thread right = new Thread(rightSorterObj);
right.start(); // i think that the problem is here
right.join(); // or here
// System.out.println(Thread.currentThread().getName() + " - ENDED\n");
}
else
{
int mid = (length / 2);
if (mid > 1)
{
// Show ("R1", false);
BitonicSort(_lo, mid, Ascending);
// Show ("R2", false);
BitonicSort(_lo+mid, mid, Ascending);
}
}
BitonicMerge(_lo, _hi, dir);
}
}
现在我将发布主要和完整的课程,只有当你想执行时
主要:
public class Program
{
public static void main(String[] args) throws InterruptedException
{
Random random = new Random();
int arraySize = (int) Math.pow(2, 7);
int[] originalData = new int[arraySize];
int lim = 20;
for (int i = 0; i < originalData.length; i++)
originalData[i] = random.nextInt(lim);
System.out.println(Arrays.toString(originalData));
System.out.printf("\n");
MultiThreadedSorter mult = new MultiThreadedSorter(originalData);
mult.Sort();
System.out.println(Arrays.toString(originalData));
System.out.println();
}
多线程排序器类
public class MultiThreadedSorter //extends BaseBitonicSorter
implements Runnable
{
public static int[] data;
private int start, end, size;
private boolean direction;
private int minimumLength = 1;
private final boolean Ascending = true, Descending = false;
public MultiThreadedSorter (int[] originalData)
{
data = originalData;
start = 0;
end = size = data.length;
direction = Ascending;
// minimumLength = data.length / Runtime.getRuntime().availableProcessors();
minimumLength = 2;
}
// Construtor chamados por cada thread antes de iniciar
private MultiThreadedSorter (int lo, int hi, boolean dir)
{
start = lo;
end = hi;
size = hi-lo;
direction = dir;
}
public void Show (String msg, boolean r)
{
System.out.println(Thread.currentThread().getName() + "\t" + msg);
if (r)
System.out.printf("De: %d\tAte: %d\t Dir: %d\n", start, end, direction ? 1 : 0);
}
@Override
public void run()
{
try
{
BitonicSort(start, end, direction);
} catch (InterruptedException ex)
{
Logger.getLogger(MultiThreadedSorter.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void Sort()
throws InterruptedException
{
BitonicSort(start, end, direction);
}
private void BitonicSort(int _lo, int _hi, boolean dir)
throws InterruptedException // join()
{
int length = _hi - _lo;
// System.out.println(Thread.currentThread().getName() + " - CRIADA");
// System.out.printf("%d\t%d\n", _lo, _hi);
if (length > 1)
{
// Show ("SORT", true);
if (length > minimumLength)
{
int mid = length / 2;
System.out.println("-- left - " + Thread.currentThread().getName());
MultiThreadedSorter leftSorterObj = new MultiThreadedSorter(_lo, _lo+mid, Ascending);
Thread left = new Thread(leftSorterObj);
left.start();
left.join();
System.out.println("-- rigth - " + Thread.currentThread().getName());
// System.out.printf("%d\t%d\n", _lo+mid, _hi);
MultiThreadedSorter rightSorterObj = new MultiThreadedSorter(_lo+mid, _hi, Descending);
Thread right = new Thread(rightSorterObj);
right.start();
right.join();
// System.out.println(Thread.currentThread().getName() + " - ENDED\n");
}
else
{
int mid = (length / 2);
if (mid > 1)
{
// Show ("R1", false);
BitonicSort(_lo, mid, Ascending);
// Show ("R2", false);
BitonicSort(_lo+mid, mid, Ascending);
}
}
BitonicMerge(_lo, _hi, dir);
}
}
private void BitonicMerge(int _lo, int _hi, boolean dir)
throws InterruptedException // join()
{
// Show ("MERGE", true);
int length = _hi - _lo;
if (length > 1)
{
if (length > minimumLength)
{
int mid = (length / 2);
for (int i = _lo; i < (_lo + mid); i++)
Compare(i, (i + mid), dir);
MultiThreadedSorter leftMergerObj = new MultiThreadedSorter(_lo, _lo+mid, dir);
Thread left = new Thread(leftMergerObj);
left.start();
left.join();
MultiThreadedSorter rightMergerObj = new MultiThreadedSorter(_lo + mid, _hi, dir);
Thread right = new Thread(rightMergerObj);
right.start();
right.join();
}
else
{
int mid = (length / 2);
for (int i = _lo; i < (_lo + mid); i++)
Compare(i, (i + mid), dir);
if (mid > 1)
{
BitonicMerge(_lo, _lo + mid, dir);
BitonicMerge(_lo + mid, _hi, dir);
}
}
}
}
private synchronized void Compare(int src, int dst, boolean dir)
{
if (dir == (data[src] > data[dst]))
Exchange(src, dst);
}
protected synchronized void Exchange(int i, int j)
{
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
【问题讨论】:
标签: java multithreading sorting parallel-processing synchronization