啟動執行緒的第三種方式之Callable
阿新 • • 發佈:2019-01-27
java中第三種啟動執行緒的方式是實現Callable介面
package com.lyzx.juc; import java.util.concurrent.Callable; 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 java.util.concurrent.TimeUnit; public class CallableTest { public static void main(String[] args) throws InterruptedException, ExecutionException { testCallableStart2(); } /** * @throws ExecutionException * @throws InterruptedException * */ public static void testCallableStart2() throws InterruptedException, ExecutionException{ int itemCount =2000; int[] arr = new int[itemCount]; for(int i=0;i<itemCount;i++){ arr[i]=i; } Object o = new Object(); AddArray xx1 = new AddArray(arr,1,1001,o); FutureTask<Integer> ft = new FutureTask<Integer>(xx1); new Thread(ft).start(); System.out.println(ft.get()); } /** * 實現Callable介面後啟動執行緒的兩種方式之執行緒池的方式啟動 * @throws InterruptedException * @throws ExecutionException */ public static void testCallableStart1() throws InterruptedException, ExecutionException{ int itemCount =2000; int[] arr = new int[itemCount]; for(int i=0;i<itemCount;i++){ arr[i]=i; } Object o = new Object(); AddArray xx1 = new AddArray(arr,1,1001,o); AddArray xx2 = new AddArray(arr,1001,2000,o); ExecutorService pool = Executors.newFixedThreadPool(3); Future<Integer> f1 = pool.submit(xx1); Future<Integer> f2 = pool.submit(xx2); pool.shutdown(); System.out.println(f1.get()+f2.get()); } } class AddArray implements Callable<Integer>{ private int[] arr; private int start; private int end; private Object lock; public AddArray(int[] arr,int start,int end,Object lock){ this.arr = arr; this.start = start; this.end = end; this.lock = lock; } @Override public Integer call() throws Exception { int result = 0; for(int i=start;i<end;i++){ result += arr[i]; TimeUnit.MICROSECONDS.sleep(20); } return result; } }