1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- class Parallel implements Solver {
- class Worker implements Runnable {
- MultiRadix mr;
- int[] arr;
- int start, end;
- boolean done = false;
- Worker(MultiRadix mr, int[] arr, int start, int end) {
- this.mr = mr;
- this.arr = arr;
- this.start = start;
- this.end = end;
- }
-
- synchronized public void run() {
- arr = mr.radixMulti(arr, start, end);
- done = true;
- notify();
- }
-
- synchronized public int[] getSorted() {
- while (!done) {
- try { wait(); } catch (InterruptedException ex) {}
- }
- return arr;
- }
- }
-
- public int[] sort(int[] arr) {
- MultiRadix mr = new MultiRadix();
-
- int n = 4;
- int d = arr.length / n;
-
- Worker[] workers = new Worker[n];
- Thread[] threads = new Thread[n];
-
- for (int i = 0; i < n; ++i) {
- int start = d * i;
- int end;
- if (i == n - 1)
- end = arr.length;
- else
- end = d * (i + 1);
-
- Worker w; Thread t;
- workers[i] = w = new Worker(mr, arr, start, end);
- threads[i] = t = new Thread(w);
- t.start();
- }
-
- int[][] arrs = new int[n][];
- for (int i = 0; i < n; ++i) {
- arrs[i] = workers[i].getSorted();
- try {
- threads[i].join();
- } catch (InterruptedException ex) {}
- }
-
- /*
- Worker w = workers[0];
- int[] a = arrs[0];
- for (int i = w.start; i < w.end; ++i) {
- System.out.print(a[i]+" ");
- }
- System.out.println("");
- System.out.println("From "+w.start+" to "+w.end);
- */
-
- return arr;
- }
- }
|