Future:java.util.concurrent包下的一个接口。
Callable和Runnable接口区别:
- Callable需要实现的方法是call(),Runnable需要实现的方法是run();
- call方法有返回值,run方法的返回值为void;
- call方法可以抛出异常,run方法不会抛出异常。
- Callable所在包为java.util.concurrent,Runnable所在包为java.lang。
相同点:二者都能封装任务代码,支持多线程。
通过Future接口可以获得执行任务的一些信息,如任务是否完成等。
早期创建线程的两种方式:继承Thread类,实现Runnable接口;
- 缺陷:不能获得执行结果,如果采用共享变量或线程间通信来实现,无疑会导致开发难度加大;
后期引入了Callable和Future接口。
Future通常和ExecutorService配合使用:
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;
class Task implements Callable<Integer>{
@Override
public Integer call() throws Exception {
System.out.println("子线程在进行计算");
Thread.sleep(3000);
int sum = 0;
for(int i=0;i<100;i++)
sum += i;
return sum;
}
}
public class Main{
public static void main(String[] args) {
ExecutorService executor = Executors.newCachedThreadPool();
Task task = new Task();
Future<Integer> result = executor.submit(task);
executor.shutdown();
System.out.println("主线程在执行任务");
try {
System.out.println("task运行结果" + result.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("所有线程执行完毕");
}
}
上述代码的执行结果为:
子线程在进行计算
主线程在执行任务
task运行结果4950
所有线程执行完毕