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