首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Java中使用多线程并行快速排序

在Java中使用多线程并行快速排序
EN

Stack Overflow用户
提问于 2016-01-25 12:01:41
回答 1查看 168关注 0票数 0

我在Java.I中对multi-threading进行了一些实验,我尝试快速排序地使用multi-threading,我正在尝试并行化在围绕支点进行分区后生成的两个数组。但是当我运行代码时,没有什么happens.It只是为了帮助无限period.Can而运行(我是**多线程(())的初学者。

代码语言:javascript
运行
复制
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);
 }
}
EN

回答 1

Stack Overflow用户

发布于 2016-01-25 13:38:36

我认为问题是:

当将方法标记为synchronized时,在整个方法块上放置一个隐藏锁。

因此,当您递归调用sort方法时,它将等待释放上一次调用的锁(为sort方法的第一次调用而创建)。

但是,在第一个调用的执行结束之前,锁是不会被释放的。另一方面,sort第一次调用的执行取决于第二次和第三次调用以及.调用sort方法。

所以你陷入僵局了。这就是你无限处境的原因。

希望这会有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34992114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档