一、Callable+Future+ExecutorService
public class Main {
public static void main(String args[]){
ExecutorService executor = Executors.newCachedThreadPool();
Future<Integer> result = executor.submit((Callable<Integer>)()->{
System.out.println("子线程执行任务");
Thread.sleep(5000);
int sum = 0;
for(int i = 0; i < 100; i++)
sum += i;
return sum;
});
executor.shutdown();
try{
Thread.sleep(1000);
}catch(InterruptedException e1){
e1.printStackTrace();
}
System.out.println("主线程执行任务");
try{
System.out.println("子线程运行结果:"+result.get());//等待子线程执行完毕
}catch(InterruptedException e){
e.printStackTrace();
}catch(ExecutionException e){
e.printStackTrace();
}
System.out.println("所有任务执行完毕");
}
}
二、Callable+FutureTask+ExecutorService
public class Main {
public static void main(String args[]){
ExecutorService executor = Executors.newCachedThreadPool();
FutureTask<Integer> futureTask = new FutureTask<Integer>((Callable<Integer>)()->{
System.out.println("子线程执行任务");
Thread.sleep(5000);
int sum = 0;
for(int i = 0; i < 100; i++)
sum += i;
return sum;
});
executor.submit(futureTask);
executor.shutdown();
try{
Thread.sleep(1000);
}catch(InterruptedException e1){
e1.printStackTrace();
}
System.out.println("主线程执行任务");
try{
System.out.println("子线程运行结果:"+futureTask.get());//等待子线程执行完毕
}catch(InterruptedException e){
e.printStackTrace();
}catch(ExecutionException e){
e.printStackTrace();
}
System.out.println("所有任务执行完毕");
}
}
三、Callable+FutureTask+Thread
public class Main {
public static void main(String args[]){
FutureTask<Integer> futureTask = new FutureTask<Integer>((Callable<Integer>)()->{
System.out.println("子线程执行任务");
Thread.sleep(5000);
int sum = 0;
for(int i = 0; i < 100; i++)
sum += i;
return sum;
});
Thread thread = new Thread(futureTask);
thread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println("主线程执行任务");
try {
System.out.println("子线程运行结果"+futureTask.get());//等待子线程运行完毕
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("所有任务执行完毕");
}
}
*注意
get(long time, TimeUnit unit),当发生超时将抛出TimeoutException异常
class Task implements Callable<Integer>{
@Override
public Integer call() throws Exception {
Thread.sleep(2000);
int sum = 0;
for(int i = 0; i < 100; i++)
sum += i;
return sum;
}
}
public class Main {
public static void main(String args[]){
FutureTask<Integer> futureTask = new FutureTask<Integer>(new Task());
ExecutorService executor = Executors.newCachedThreadPool();
executor.execute(futureTask);
while(true){
try{
if(futureTask.isDone()){
System.out.println("Done");
executor.shutdown();
return;
}
System.out.println("Waiting for FutureTask to complete");
//get(long time, TimeUnit unit)超时会抛出异常
Integer result = futureTask.get(500L, TimeUnit.MILLISECONDS);
if(result != null){
System.out.println("FutureTask output="+result);
}
}catch(InterruptedException | ExecutionException e){
e.printStackTrace();
}catch(TimeoutException e){
System.out.println("FutureTask output is null");
}catch(Exception e){
e.printStackTrace();
}
}
}