欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

多线程查找大型数组的最大值

最编程 2024-05-21 20:40:57
...
【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

分治算法

我们可以将求大数组的最大值的任务进行分解。将大数组分成几部分,分别求这几部分的最大值,最后再求最大值中的最大值。

首先编写求数组最大值的任务Callable。然后将任务交给执行器Executor。执行器会为每个任务开启一个线程。每个任务都会返回一个Future。里面包含了任务的返回值。内部是隐藏了回调的细节。

package cn.mygolang.thread;
 
import java.util.concurrent.Callable;
 
/**
 * Created by hasee on 2016/11/12.
 */
public class FindMaxTask implements Callable<Integer> {
 
    private int[] data;
    private int start;
    private int end;
 
    public FindMaxTask(int[] data, int start, int end) {
        this.data = data;
        this.start = start;
        this.end = end;
    }
 
    @Override
    public Integer call() throws Exception {
        int max = Integer.MIN_VALUE;
        for (int i = start; i < end; i++) {
            if (max < data[i]) {
                max = data[i];
            }
        }
        return max;
    }
}
package cn.mygolang.thread;
 
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
 
/**
 * Created by hasee on 2016/11/12.
 */
public class MultithreadMaxFinder {
 
    public static int max(int[] data) throws ExecutionException, InterruptedException {
        if (data.length == 1) {
            return data[0];
        } else if (data.length == 0) {
            throw new IllegalArgumentException("data.length == 0");
        }
        // 将任务分解为两部分
        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 Math.max(future1.get(), future2.get());
 
    }
 
}

Future是一种非常方便的做法,可以启动多个线程来处理一个问题的不同部分,然后等待题目全部结束之后再继续。executor和executor服务允许你用不同的方案将任务分配给不同的线程。

推荐阅读