使用多线程对数组进行排序/合并

时间:2016-02-08 03:54:35

标签: java multithreading sorting merge

我正在尝试学习多线程但却无法掌握它。我在这里有一个例子。 我们的想法是使用两个线程对两个数组a和b进行排序,并使用另一个线程将排序后的数组合并到数组c。 这是我的代码。我尝试使用线程没有用,所以我把代码放在没有线程

的情况下
public class Main {
  public static void main(String[] args){
    Random r = new Random(System.currentTimeMillis());
    int n = r.nextInt(101) + 50;
    int[] a = new int[n];
    for(int i = 0; i < n; i++)
      a[i] = r.nextInt(100);
    n = r.nextInt(101) + 50;
    int[] b = new int[n];
    for(int i = 0; i < n; i++)
      b[i] = r.nextInt(100);
    SortThread t1 = new SortThread(a);  
    SortThread t2 = new SortThread(b);  
    MergeThread m = new MergeThread(t1.get(),t2.get());
    System.out.println(Arrays.toString(m.get()));
  }
}

public class SortThread {
  int[] x; 

  public SortThread(int[] x){
    this.x = x;
    run();    
  }
    public void run(){
      sort(x);
  }

  private void sort(int[] x){
    for(int i = 0; i < x.length ; i++){
      int indexOfSmallest = findIndexOfSmallest(x, i);
      int t = x[i];
      x[i] = x[indexOfSmallest];
      x[indexOfSmallest] = t;
    }
  }

  private int findIndexOfSmallest(int[] a, int from){
    int indexOfSmallest = from;

    for(int i = from; i < a.length; i++)
      if(a[i] < a[indexOfSmallest])
        indexOfSmallest = i;
    return indexOfSmallest;
  }


  public int[] get(){
    return x;
  }
}

public class MergeThread {
  int[] a;
  int[] b;
  int[] c;

  public MergeThread(int[] a, int[] b){
    this.a = a;
    this.b = b;
    c = new int[a.length + b.length];
    run();      
  }
  public void run(){
    merge();
  }

  private void merge(){
    int aIndex = 0, bIndex = 0, cIndex = 0;
    while(aIndex < a.length && bIndex < b.length)
      if(a[aIndex] < b[bIndex])
        c[cIndex++] = a[aIndex++];
      else
        c[cIndex++] = b[bIndex++];

    while(aIndex < a.length)
      c[cIndex++] = a[aIndex++];

    while(bIndex < b.length)
      c[cIndex++] = b[bIndex++];
  }

  public int[] get(){
    return c;
  }
}

2 个答案:

答案 0 :(得分:0)

一个线程应该实现runnable接口,并且应该覆盖方法run。

请阅读完整参考JAVA,它有很多很好的例子。

答案 1 :(得分:0)

就像我提到的那样,即使你扩展线程/实现runnable,你创建的线程也必须由start方法启动,应该再次覆盖。

 public void start () { System.out.println("Starting " + threadName ); if (t == null) { t = new Thread (this, threadName); t.start (); } }

在此之后,可以创建一个新的线程实例并启动它。在你的情况下它应该是

  t1.start()
  t2.start()
  m.start()