并行搜索,分而治之的思想

public class ConcurrentSearch {数组

static int[] arr;
static ExecutorService pool = Executors.newCachedThreadPool();
static final int Thread_Num = 2;
static AtomicInteger result = new AtomicInteger(-1);

public static int search(int searchValue,int begin,int end){
    int i=0;
    for(i=begin;i<end;i++){
        if(result.get()>0){//默认值是小于0的,因此若是大于0就证实取到了数据
            return result.get();
        }
        if(arr[i]==searchValue){//若是设置失败,证实其余线程已经找到了
            if(!result.compareAndSet(-1,i)){
                return result.get();
            }
            return i;
        }
    }
    return -1;
}


public static class SearchTask implements Callable<Integer>{
    int begin,end,searchValue;

    public SearchTask(int begin, int end, int searchValue) {
        this.begin = begin;
        this.end = end;
        this.searchValue = searchValue;
    }

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


public static int pSearch(int searchValue) throws ExecutionException, InterruptedException {
    int subArrSize = arr.length/Thread_Num+1;//按照线程数进行分组
    List<Future<Integer>> re = new ArrayList<>();
    /**大概思想逻辑
     * 对该段下面for的解释
     * 假设arr数组里有20个数字,那么subArrSize=11
     * 第一轮循环end=11;
     * 提交一个线程执行index0到11的数据
     * 第一轮循环完后,i=11 i<20
     * 开始执行第二轮
     * 第二轮循环end=22,最终等于19
     * 因此第二轮执行 index 11 19
     * 完了以后i=22因此不存在第三轮循环
     */
    for(int i = 0;i<arr.length;i+=subArrSize){
        int end =i+subArrSize;
        if(end>=arr.length){
            end =arr.length;
        }
        re.add(pool.submit(new SearchTask(searchValue,i,end)));
    }
    for(Future<Integer> fu:re){
        if(fu.get()>=0){
            return fu.get();
        }
    }
    return -1;
}
public static void main(String[] args) {

}

}ide

相关文章
相关标签/搜索