1.Callable是什么,可以干什么用?
Callable是一个创建线程时使用的一个接口,那它是干什么的呢?它和Runnable可以说是兄弟两,Runnable在创建多线程的时候是没有返回值的,但是Callable它是带有返回值的。我们一般想要有返回值的多线程的时候就可以使用Callable。
2.用Runnable创建有返回值的多线程
我们知道用Runnable创建多线程的时候是没有返回值的,但是我们可以创建一个专门用于返回的元素,从而把值就可以返回回去了。
static class result{
public static int sum;
}
public static void main(String[] args) throws InterruptedException {
Object locker=new Object();
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
int sum=0;
for (int i = 0; i < 10; i++) {
sum+=i;
}
result.sum=sum;
synchronized (locker){
locker.notify();
}
}
});
thread.start();
while (result.sum==0){
synchronized (locker){
locker.wait();
}
}
System.out.println(result.sum);
}
3.如何用Callable来创建一个带返回值的线程
这里面有一个重要的点就是Thread它不能直接接收Callable这个接口,Callable需要用FutureTsak进行封装一下,然后再传给Thread。
public static void main(String[] args) throws ExecutionException, InterruptedException {
Callable<Integer>callable=new Callable<Integer>() {
@Override
public Integer call() throws Exception {
int sum=0;
for (int i = 0; i <=1000 ; i++) {
sum+=i;
}
return sum;
}
};
FutureTask<Integer>futureTask=new FutureTask<>(callable);
Thread t=new Thread(futureTask);
t.start();
System.out.println(futureTask.get());
}