我在Java.I中对multi-threading进行了一些实验,我尝试快速排序地使用multi-threading,我正在尝试并行化在围绕支点进行分区后生成的两个数组。但是当我运行代码时,没有什么happens.It只是为了帮助无限period.Can而运行(我是**多线程(())的初学者。
import java.util.Arrays;
import java.util.Random;
public class QuickSort {
public synchronized static int pivot(int[] a, int lo, int hi){
int mid = (lo+hi)/2;
int pivot = a[lo] + a[hi] + a[mid] - Math.min(Math.min(a[lo], a[hi]), a[mid]) - Math.max(Math.max(a[lo], a[hi]), a[mid]);
if(pivot == a[lo])
return lo;
else if(pivot == a[hi])
return hi;
return mid;
}
public synchronized static int partition(int[] a, int lo, int hi){
int k = pivot(a, lo, hi);
//System.out.println(k);
swap(a, lo, k);
//System.out.println(a);
int j = hi + 1;
int i = lo;
while(true){
while(a[lo] < a[--j])
if(j==lo) break;
while(a[++i] < a[lo])
if(i==hi) break;
if(i >= j) break;
swap(a, i, j);
}
swap(a, lo, j);
return j;
}
public synchronized static void sort(int[] a, int lo, int hi){
if(hi<=lo) return;
int p = partition(a, lo, hi);
Thread t1=new Thread(new Runnable(){
@Override
public void run() {
sort(a, lo, p-1);
}
});
Thread t2=new Thread(new Runnable(){
public void run()
{
sort(a, p+1, hi);
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public synchronized static void swap(int[] a, int b, int c){
int swap = a[b];
a[b] = a[c];
a[c] = swap;
}
public synchronized static void sort(int[] a){
sort(a, 0, a.length - 1);
System.out.print(Arrays.toString(a));
}
public static void main(String[] args) {
int arr[] = new int[1001];
Random rand=new Random();
for(int i=0;i<1000;i++)
{
arr[i]=rand.nextInt(350);
}
float start=System.currentTimeMillis();
sort(arr);
float end=System.currentTimeMillis();
System.out.println("Time take to sort");
System.out.println(end-start);
}
}
发布于 2016-01-25 13:38:36
我认为问题是:
当将方法标记为synchronized
时,在整个方法块上放置一个隐藏锁。
因此,当您递归调用sort
方法时,它将等待释放上一次调用的锁(为sort
方法的第一次调用而创建)。
但是,在第一个调用的执行结束之前,锁是不会被释放的。另一方面,sort
第一次调用的执行取决于第二次和第三次调用以及.调用sort
方法。
所以你陷入僵局了。这就是你无限处境的原因。
希望这会有帮助。
https://stackoverflow.com/questions/34992114
复制相似问题