多线程查找

1.本算法采用的是将多线程查找实现方法:将大批量数据切割分成多份,让线程去寻找,如果找到了,则返回数据

DavideSearch
package cn.lonecloud.search;

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author lonecloud
 * @version v1.0
 * @date 下午3:37 2018/5/9
 */
public class DavideSearch<T> {

    private T[] data;

    private int divCount;

    private AtomicInteger index;

    public DavideSearch(T[] data, int divCount) {
        this.data = data;
        this.divCount = divCount;
        index = new AtomicInteger(-1);
    }

    static ExecutorService service = new ThreadPoolExecutor(0, 10, 60, TimeUnit.SECONDS, new SynchronousQueue<>(), new ThreadFactory() {
        AtomicInteger integer = new AtomicInteger();

        @Override
        public Thread newThread(Runnable r) {
            return new Thread(r, "search-thread" + integer);
        }
    });

    public <T> int divSearch(T searchValue) {
        int subSize = data.length / divCount;
        for (int i = 0; i < data.length; i += subSize) {
            int end = i + subSize;
            if (end > data.length) {
                end = data.length;
            }
            SearchTask<T> searchTask = new SearchTask<>(i, end, searchValue, (T[]) data, index);
            Future<Integer> submit = service.submit(searchTask);
        }
        return index.get();
    }
}

SearchTask

package cn.lonecloud.search;

import java.util.Objects;
import java.util.concurrent.Callable;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author lonecloud
 * @version v1.0
 * @date 上午9:52 2018/5/9
 */
public class SearchTask<T> implements Callable<Integer> {
    private int begin, end;
    private T searchValue;
    private T[] data;
    private AtomicInteger result;

    public SearchTask(int begin, int end, T searchValue, T[] data, AtomicInteger index) {
        this.begin = begin;
        this.end = end;
        this.searchValue = searchValue;
        this.data = data;
        this.result = index;
    }

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

    private int search(T searchValue, int begin, int end) {
        int i = 0;
        for (i = begin; i < end; i++) {
            if (data[i].equals(searchValue)) {
                //并发如果其他线程先找到
                if (!result.compareAndSet(-1, i)) {
                    return result.get();
                }
                return i;
            }
        }
        return -1;
    }
}

测试类

package cn.lonecloud;

import cn.lonecloud.search.DavideSearch;
import org.junit.jupiter.api.Test;

import java.util.Random;
import java.util.UUID;

/**
 * @author lonecloud
 * @version v1.0
 * @date 下午3:52 2018/5/9
 */
public class MainTest {

    static final int MAX=100000;
    @Test
    public void integerTest() {
        Integer[] arr = new Integer[MAX];
        Random random = new Random();
        int index = random.nextInt(MAX);
        for (int i = 0; i < MAX; i++) {
            arr[i] = random.nextInt(MAX);
        }
        DavideSearch<Integer> davideSearch = new DavideSearch<>(arr, 3);
        int i = davideSearch.divSearch(arr[index]);
        System.out.print(index + "-------->" + i);
    }

    @Test
    public void StringTest() {
        long start = System.currentTimeMillis();
        String[] arr = new String[MAX];
        Random random = new Random();
        int index = random.nextInt(MAX);
        for (int i = 0; i < MAX; i++) {
            arr[i] = UUID.randomUUID().toString();
        }
        DavideSearch<String> davideSearch = new DavideSearch<>(arr, 3);
        int i = davideSearch.divSearch(arr[index]);
        System.out.println(index + "-------->" + i);
        System.out.println("end"+(System.currentTimeMillis()-start));
    }
    @Test
    public void NoramlSearch() {
        long start = System.currentTimeMillis();
        String[] arr = new String[MAX];
        Random random = new Random();
        int index = random.nextInt(MAX);
        for (int i = 0; i < MAX; i++) {
            arr[i] = UUID.randomUUID().toString();
        }
        for (int i = 0; i < arr.length; i++) {
            if (arr[i].equals(arr[index])){
                System.out.println(index + "-------->" + i);
            }
        }
        System.out.println("end"+(System.currentTimeMillis()-start));
    }
}

原文地址:https://www.cnblogs.com/lonecloud/p/9014965.html

时间: 2024-08-06 12:27:12

多线程查找的相关文章

9.20 windows静态库和动态库的使用 函数可变参 递归使用 多线程查找

指针内存面试题:                           对整个数组取地址+1前进了整个数组.再强转成double*  根据double*步长再减去1 #include <stdio.h> int main() { double db[5] = {1.0,2.0,3.0,4.0,5.0}; printf("%f\n", *((double *)(&db + 1) - 1)); // 结果输出5.0 return 0; } #include <std

Java 多线程查找文件中的内容

学过了操作系统,突然不知道多线程有什么用了. 看了一下百度,发现多线程,可以提升系统利用率 在系统进行IO操作的时候,CPU可以处理一些其他的东西,等IO读取到内存后,CPU再处理之前的操作. 总之可以在用户层面,可以提升效率,不过,有时候多线程设计不当,调试也很麻烦 今天尝试一下简单的查找文件后缀以txt 里的内容 demo SeachFileContent类,用来查询文件内容 package thread; import java.io.File; import java.io.IOExce

52.多线程查找数据

设置线程信息结构体 1 struct threadInfo 2 { 3 int *pstart; 4 int length; 5 int key; 6 int id; 7 }; 设置数组 1 int a[100]; 2 time_t ts; 3 srand((unsigned int)time(&ts)); 4 for (int i = 0; i < 100; i++) 5 { 6 a[i] = rand() % 10; 7 } 初始化线程结构体并开始线程 1 struct threadIn

golang 多线程查找文件内容

1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "path/filepath" 8 "strings" 9 ) 10 11 var matchCount = 0 12 var ch = make(chan int, 512) 13 14 func findFile(path string, text string) { 15 var pa

传智播客C语言视频第二季(增加诸多C语言案例讲解,有效下载期为10.5-10.10关闭)

?? 卷 backup 的文件夹 PATH 列表卷序列号为 000000F4 D4A8:14B0J:.│  1.txt│  2.txt│  ├─1传智播客_尹成_C语言从菜鸟到高手_第一章C语言概述A│  ├─文档│  │      第1讲 C语言第一阶段.doc│  │      │  └─视频│          第1讲 C语言第一阶段.mp4│          ├─2传智播客_尹成_C语言从菜鸟到高手_第二章C语言跨平台HelloWorld-A│  ├─第10节 2.5.1-2.5.7C

快速批量修改cvs的root文件

1 import java.io.File; 2 import java.io.FileOutputStream; 3 import java.io.IOException; 4 import java.util.LinkedList; 5 6 public class ModifyCVSIPV2 { 7 8 private static final String OVER_FLAG="GAMEOVER"; 9 10 private static void searchCVSFiles

java--线程--习题集锦

匿名类的一个好处是可以很方便的访问外部的局部变量. 前提是外部的局部变量需要被声明为final.(JDK7以后就不需要了) ====================== 同步方法1:普通式 同步方法2:在对象方法里 写关键字,用this 同步方法3:在方法前,加上修饰符synchronized,效果等同方法2 ================== 题目1--同步查找文件内容 把 练习-查找文件内容 改为多线程查找文件内容 原练习的思路是遍历所有文件,当遍历到文件是 .java的时候,查找这个文件

多情景下的TopK问题

TopK 问题 少量数据,可以全部读入内存 LeetCode原题,两种方法: 优先队列(堆排序) QuickSelect 大量数据,无法全部读入内存 50 GB 数据,CPU 2 核,512 MB 内存 使用堆排序,内存中只需要常驻当前TopK,读取数据时只读取一个数据分组,比如 100 MB 50 GB 数据,CPU 2 核,2 GB 内存 充分利用内存,读取数据时读取多个分组,比如 10 个: 使用多线程在分组内部使用堆排序读取分组内的 TopK 在10个TopK内使用QuickSelect

Python多线程问题的资料查找与汇总by tsy

声明: 1)本报告由博客园bitpeach撰写,版权所有,免费转载,请注明出处,并请勿作商业用途. 2)若本文档内有侵权文字或图片等内容,请联系作者bitpeach删除相应部分. 3)本文档内容涉及Python的多线程问题,没有介绍多线程的概念,没有介绍多线程的程序模块,只是讨论多线程产生的交织问题,并查找一些材料进行佐证和学习. 4)仅仅作为参考用途,抛砖引玉,不作为证据证明用途,请自行取舍,核实引用. 5)本文的超链接,请不要直接点击,为方便阅读,请选择“在新标签页打开”. 非常抱歉,我不是