博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程求大数组的最大值
阅读量:6221 次
发布时间:2019-06-21

本文共 1891 字,大约阅读时间需要 6 分钟。

hot3.png

分治算法

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

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

package cn.mygolang.thread; import java.util.concurrent.Callable; /** * Created by hasee on 2016/11/12. */public class FindMaxTask implements Callable
{ 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
future1 = service.submit(task1); Future
future2 = service.submit(task2); return Math.max(future1.get(), future2.get()); } }

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

转载于:https://my.oschina.net/hutaishi/blog/1021779

你可能感兴趣的文章
2018百度之星资格赛A B F
查看>>
App 卸载记录
查看>>
Chisel3 - util - BitPat
查看>>
多线程
查看>>
【题解】【BT】【Leetcode】Populating Next Right Pointers in Each Node
查看>>
python 判断101-200之间有多少个素数,并输出所有素数。
查看>>
[转载]position的四个属性值: relative ,absolute ,fixed,static
查看>>
韬晦术
查看>>
DirectX 12 API
查看>>
在函数形参表中,允许不给出形参数组的长度,或用一个变量来表示数组元素...
查看>>
TCAM 与CAM
查看>>
Hibernate_day03--Hibernate多对多操作
查看>>
MVVM: 通过 x:Bind 实现 MVVM(不用 Command)
查看>>
java 左移 右移
查看>>
subline text 3快捷键
查看>>
Cordova 和 React-Native对比
查看>>
leetcode621
查看>>
时间过滤器
查看>>
ATM+购物商城(第一版)
查看>>
Android 音量键拦截
查看>>