分治算法
我们可以将求大数组的最大值的任务进行分解。将大数组分成几部分,分别求这几部分的最大值,最后再求最大值中的最大值。
首先编写求数组最大值的任务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); Futurefuture1 = service.submit(task1); Future future2 = service.submit(task2); return Math.max(future1.get(), future2.get()); } }
Future是一种非常方便的做法,可以启动多个线程来处理一个问题的不同部分,然后等待题目全部结束之后再继续。executor和executor服务允许你用不同的方案将任务分配给不同的线程。