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

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

相關文章
相關標籤/搜索