摘要:默认值是小于的,所以如果大于就证明取到了数据如果设置失败,证明其他线程已经找到了按照线程数进行分组大概思想逻辑对该段下面的解释假设数组里有个数字,那么第一轮循环提交一个线程执行到的数据第一轮循环完后,开始执行第二轮第二轮循环,最终等于
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;i0){//默认值是小于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 { 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 > 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){ end =arr.length; } re.add(pool.submit(new SearchTask(searchValue,i,end))); } for(Future fu:re){ if(fu.get()>=0){ return fu.get(); } } return -1; } public static void main(String[] args) { }
}
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/74788.html
摘要:简单算法之递归我向算法工程师请教如何学好算法,他跟我提议说先看懂汉诺塔,这是一个小朋友都会玩的游戏,里面用到了递归的思想。递归实现倒计时函数下面这个倒计时函数使用了递归,而且使用了尾递归优化。 前端需要算法吗? 别想太多,肯定要!!! 什么是算法 你以为的算法是各种排序,选择排序、快速排序、归并排序,广深搜索、动态规划...... 然而,算法实际上指的是解决某个实际问题的方法。 解决同...
阅读 822·2021-11-15 17:58
阅读 3611·2021-11-12 10:36
阅读 3753·2021-09-22 16:06
阅读 912·2021-09-10 10:50
阅读 1300·2019-08-30 11:19
阅读 3290·2019-08-29 16:26
阅读 905·2019-08-29 10:55
阅读 3317·2019-08-26 13:48