Write a Java class that allows parallel search in an array of integer. It provides the following static method:Solution:
public static int parallelSearch(int[ ] a , int numThreads)This method creates as many threads as specified by numThreads, divides the array a into that many parts, and gives each thread a part of the array to search for sequentially. If any thread finds x, then it returns an index i such that A [ i ] = x. Otherwise, the method returns -1.
package org.zero.concurrent.chap01;P.S: Any suggestion to improve the code is welcome.
import java.util.Arrays;
public class ParallelSearch {
private static int index = -1;
public static int parallelSearch(int search, int[] in, int numThreads) {
// partition
int partitionSize = in.length / numThreads;
Thread[] threads = new Thread[numThreads];
int end = 0;
int begin = 0;
// search
for (int i = 0; i < numThreads; i++) {
end = begin + partitionSize;
if (i == numThreads - 1 || end > in.length) {
end = in.length;
}
Search target = new Search(begin, end, in, search);
System.out.println(target);
threads[i] = new Thread(target);
threads[i].start();
System.out.println(threads[i].getName());
begin = end;
}
return index;
}
public static void main(String[] args) {
int[] a = new int[100];
for (int i = 0; i < a.length; i++) {
a[i] = (int) (Math.random() * 10);
}
int parallelSearch = parallelSearch(2, a, 7);
if (-1 == parallelSearch) {
System.out.println("not found");
} else {
System.out.println("found at: " + parallelSearch);
}
}
private static class Search implements Runnable {
int begin;
int end;
int[] a;
int x;
public Search(int begin, int end, int[] a, int x) {
super();
if (end < begin) {
throw new IllegalStateException();
}
this.begin = begin;
this.end = end;
this.a = a;
this.x = x;
}
@Override
public void run() {
for (int i = begin; i < end; i++) {
if (x == a[i]) {
index = i;
System.out.println(i + " "
+ Thread.currentThread().getName());
// break;
}
}
}
@Override
public String toString() {
return "Search [a=" + Arrays.toString(a) + ", length=" + a.length
+ ", begin=" + begin + ", end=" + end + ", x=" + x + "]";
}
}
}
1 comment:
The code can be simplified quite a bit using the ExecutorService.
Regards,
Kamal
Post a Comment