Java 启动NewFixedThreadPool分段查找数组内最大值

来源:互联网 发布:hive sql与sql对比 编辑:程序博客网 时间:2024/06/06 09:05

有些时候数据量过大,只使用单线程查找,浪费了多核资源,我们可以使用线程池方式,开启多个线程,将数组分段给不同线程查找最大值,然后对比区域内大值,最终返回最大值。

子线程Callback线程

import java.util.concurrent.Callable;public class FindMaxTask implements Callable<Integer> {    private int[] data;    private int start;    private int end;    public FindMaxTask(int[] data, int start, int end) {        // TODO Auto-generated constructor stub        this.data =data;        this.start = start;        this.end = end;    }    @Override    public Integer call() throws Exception {        // TODO Auto-generated method stub        int max = Integer.MIN_VALUE;        for (int i = start; i < end; i++) {            if (data[i] > max) {                max = data[i];            }        }        return max;    }}

主线程使用NewFixedThreadPool:

import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.FutureTask;import com.gy.algorithm.FindMaxTask;public class MultithreadMaxFinder {    public static int max(int[] data) throws InterruptedException, ExecutionException{        if (data.length == 1) {            return data[0];        } else if (data.length == 0) {            throw new IllegalArgumentException();        }        FindMaxTask task1 = new FindMaxTask(data, 0, data.length/2);        FindMaxTask task2 = new FindMaxTask(data, data.length/2, data.length);        ExecutorService service = Executors.newFixedThreadPool(2);        Future<Integer> future1 = service.submit(task1);        Future<Integer> future2 = service.submit(task2);        return future1.get() > future2.get() ? future1.get():future2.get();         }    public static void main(String[] args) {        int[] data = new int[100000000];        for (int i = 0; i < data.length; i++) {            data[i]  = i;        }        long st = System.currentTimeMillis();        try {            max(data);        } catch (InterruptedException | ExecutionException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        long et = System.currentTimeMillis();        System.out.println("耗时: " + (et - st) + "ms");          }}
原创粉丝点击