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;
}
}