对无序数组的并发搜索的实现可以充分的用到多cpu的优势

一种简单的策略是将原始数组按照期望的线程数进行分割,如果我们计划使用两个线程进行搜索,就可以把一个数组分成两个,每个线程各自独立的搜索,当其中有一个线程找到数据后,立即返回结果的index即可。

首先index需要采用atomicinteger来进行修饰,默认初始化的值为-1,意义为当前未找到,由于内部采用CAS机制,线程在遍历比较是否相等之前,会通过atomicinteger中的get方法拿到当前的值,如果大于等于0,那么说明别的线程已经找到了结果,直接返回get值就可以。如果比较的过程中发现相等了,那么调用atomicinteger中的compareAndSet(-1,i),如果方法返回成功,则说明当前的线程是第一个发现结果的,那么返回当前index即可,如果失败,则说明别的线程先获得了结果,直接返回atomicinteger中的get方法获取的值即可。

整个过程采用future实现,拿到了Future后,不断地轮询结果,如果大于0即返回结果。

具体实现:

package parallel;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicInteger; public class SeatchTask implements Callable<Integer>{
static int[] arr = {2,34,5,6};
static ExecutorService pool = Executors.newCachedThreadPool();
static final int Thread_Num = 2;
static AtomicInteger result = new AtomicInteger(-1);
int begin,end,searchValue;
public static int search(int searchValue, int beginPos, int endPos){
int i = 0;
for(i = beginPos; i < endPos;i ++){
if(result.get() > 0){
return result.get();
}
if(arr[i] == searchValue){
if(!result.compareAndSet(-1, i)){
return result.get();
}
return i;
}
}
return -1;
}
@Override
public Integer call() throws Exception {
int re = search(searchValue, begin, end);
return re;
}
public SeatchTask(int searchValue, int begin, int end){
this.searchValue = searchValue;
this.begin = begin;
this.end = end;
}
public static int pSearch(int searchValue) throws InterruptedException, ExecutionException{
int subArrSize = arr.length/Thread_Num + 1;
List<Future<Integer>> re = new ArrayList<Future<Integer>>();
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 SeatchTask(searchValue, i, end)));
}
for(Future<Integer> fu : re){
if(fu.get() >= 0){
return fu.get();
}
}
return -1;
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
int index = pSearch(34);
System.out.println(index);
}
}

对无序数组的并发搜索的java实现的更多相关文章

  1. java面向对象的有序数组和无序数组的比较

    package aa; class Array{ //定义一个有序数组 private long[] a; //定义数组长度 private int nElems; //构造函数初始化 public ...

  2. 快速查找无序数组中的第K大数?

    1.题目分析: 查找无序数组中的第K大数,直观感觉便是先排好序再找到下标为K-1的元素,时间复杂度O(NlgN).在此,我们想探索是否存在时间复杂度 < O(NlgN),而且近似等于O(N)的高 ...

  3. 无序数组a,求a[i]-a[j]的最大值,且i<j

    一道面试题:对于无序数组a,求a[i]-a[j]的最大值,其中i<j package test; import java.util.Arrays; public class FindMax { ...

  4. 细说并发5:Java 阻塞队列源码分析(下)

    上一篇 细说并发4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文 ...

  5. 《程序员代码面试指南》第八章 数组和矩阵问题 找到无序数组中最小的k 个数

    题目 找到无序数组中最小的k 个数 java代码 package com.lizhouwei.chapter8; /** * @Description: 找到无序数组中最小的k 个数 * @Autho ...

  6. 《深入了解java虚拟机》高效并发读书笔记——Java内存模型,线程,线程安全 与锁优化

    <深入了解java虚拟机>高效并发读书笔记--Java内存模型,线程,线程安全 与锁优化 本文主要参考<深入了解java虚拟机>高效并发章节 关于锁升级,偏向锁,轻量级锁参考& ...

  7. 有1,2,3一直到n的无序数组,排序

    题目:有1,2,3,..n 的无序整数数组,求排序算法.要求时间复杂度 O(n), 空间复杂度O(1). 分析:对于一般数组的排序显然 O(n) 是无法完成的. 既然题目这样要求,肯定原先的数组有一定 ...

  8. 探索 Java 同步机制[Monitor Object 并发模式在 Java 同步机制中的实现]

    探索 Java 同步机制[Monitor Object 并发模式在 Java 同步机制中的实现] https://www.ibm.com/developerworks/cn/java/j-lo-syn ...

  9. 【算法】数组与矩阵问题——找到无序数组中最小的k个数

    /** * 找到无序数组中最小的k个数 时间复杂度O(Nlogk) * 过程: * 1.一直维护一个有k个数的大根堆,这个堆代表目前选出来的k个最小的数 * 在堆里的k个元素中堆顶的元素是最小的k个数 ...

随机推荐

  1. 修改 item2 用户名

    首先在命令行输入 cd .oh-my-zsh/themes 如下图: 然后命令行输入 sudo vi agnoster.zsh-theme 如下图: 最后在编辑主题文件 在 prompt_segmen ...

  2. CoreThink开发(十一)首页控制器判断移动设备还是PC并做相应处理

    在home模块Index控制器添加判断代码 application\Home\Controller\IndexController.class.php <?php // +----------- ...

  3. MSSQL获取昨天,本周,本月。。。

    特别说明下:以下统计本周数据时,星期天是作为下周的第一天,而不是本周最后一天,因此你把星期天作为本周最后一天时,你需要在getDate()的基础上减一天,如dateadd('day', -1, get ...

  4. responseEntity 实现文件下载

    @RequestMapping("/testResponseEntity") public ResponseEntity<byte[]> testResponseEnt ...

  5. 用python实现一个计算器

    import re def atom_cal(exp): # 计算乘除法 if '*' in exp: a,b = exp.split('*') return str(float(a) * float ...

  6. 保护你的代码,生成.a文件以及.framework文件需要注意的地方

    一个好的设计,一个方便使用的控件封装,一个酷炫的动画... 是不是迫不及待要分享给大家你的每一个突然蹦出来的好的idea,那就下手吧! 可是,你想要的只是让大家使用它,而不是把所有技术点都公开给每个人 ...

  7. 一个linux命令(6/12):cat 命令

    cat主要有三大功能:1.一次显示整个文件.$ cat filename2.从键盘创建一个文件.$ cat > filename     只能创建新文件,不能编辑已有文件.3.将几个文件合并为一 ...

  8. [国家集训队] calc(动规+拉格朗日插值法)

    题目 P4463 [国家集训队] calc 集训队的题目真是做不动呀\(\%>\_<\%\) 朴素方程 设\(f_{i,j}\)为前\(i\)个数值域\([1,j]\),且序列递增的总贡献 ...

  9. Linux下多线程下载工具MWget和Axel使用介绍

    linux运维在操作linux过程中,用得最多的linux下载工具想必一定是wget,没有看到哪一台服务器没装过wget的,或许有人使用ftp下载,也有人使用多线程的axel以及ProZilla,毫无 ...

  10. Idea中解决Git中pull代码内容冲突

    Git开发中,由于项目开发人员不只一个,所以在代码开发中,多个开发人员可能会对同一文件同一地方的代码进行修改,这样在先后提交到master上时,就会产生冲突,以下是演示冲突产生和解决冲突的示例: 1. ...