您的位置:首页 > 编程语言 > Java开发

Java利用Callable和Future进行并行搜索

2017-05-09 18:04 204 查看


Java利用Callable和Future进行并行搜索

public class Search {
static int[] array = new int[1000000];
/*线程数量*/
static int Thread_num = 100;
/*返回目标下标*/
static AtomicInteger result = new AtomicInteger(-1);
/*线程池*/
static ExecutorService pool = Executors.newCachedThreadPool();

/*搜索函数*/
public static int search(int value,int begin,int end) {
int i=0;
for( i=begin;i<end;i++) {
/*如果结果已经有了,就进行返回*/
if (result.get()>=0) {
return result.get();
}

if (array[i]==value) {
/*结果不能赋予也进行返回,说明其它线程已经找到了*/
if (!result.compareAndSet(-1,i)) {
return result.get();
}
return i;
}
}
return -1;
}

/*搜索的线程*/
public static class searchTask implements Callable<Integer>{
int begin,end,value;

public searchTask(int value,int begin,int end) {
this.begin=begin;
this.end=end;
this.value=value;
}

@Override
public Integer call() throws Exception {
int re = search(value, begin, end);
return re;
}

}

/*利用线程池进行并行搜索*/
public static void pSearch(int value) throws InterruptedException, ExecutionException {
for(int i=0;i<1000000;i++) {
array[i] = i;
}

int size = array.length/2+1;
List<Future<Integer>> re = new ArrayList<>();
for(int i=0;i<array.length;i+=size) {
int end = i+size;
if (end>=array.length) {
end=array.length;
}

re.add(pool.submit(new searchTask(value, i, end)));
}

for(Future<Integer> fu:re) {
if (fu.get()>=0) {
System.out.println(fu.get());
}
}

}
public static void main(String[] args) throws InterruptedException, ExecutionException {
long start = System.currentTimeMillis();
Search search = new Search();

search.pSearch(999999);
System.out.println(System.currentTimeMillis()-start);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: