一)Callable接口
Runnable和Callable接口的区别
1)Callable接口
1.Callable的线程方法名字为call
2.Callable的线程方法有返回值,并且返回值类型为Callable的泛型
3.Callable的方法有异常
class CallableDemo implements Callable<Integer>
{
@Override
public Integer call() throws Exception
{
return null;
}
}
class RunnableDemo implements Runnable{
@Override
public void run()
{
}
}
测试Callable线程接口
在使用上需要依赖FutureTask进行实现,然后将实现了Callable接口的类传入FutureTask中,使用Thread进行线程的启动
public class TestCallable
{
public static void main(String[] args)
{
CallableDemo callableDemo = new CallableDemo();
FutureTask<Integer> futureTask = new FutureTask<>(callableDemo);
new Thread(futureTask).start();
}
}
class CallableDemo implements Callable<Integer>
{
@Override
public Integer call() throws Exception
{
int sum = 0;
for (int i = 0;i<10000000;i++){
sum+=1;
System.out.println(sum);
}
return sum;
}
}
返回值的接收
注意在返回值接收的时候,Callable是处于闭锁的,也就是说只有当前线程执行结束吼才能获取到返回值。
获取返回值的方法是在FutureTask类中的get方法
public class TestCallable
{
public static void main(String[] args) throws ExecutionException, InterruptedException
{
CallableDemo callableDemo = new CallableDemo();
FutureTask<Integer> futureTask = new FutureTask<>(callableDemo);
new Thread(futureTask).start();
Integer integer = futureTask.get();
System.out.println("===========================");
System.out.println(integer);
}
}
class CallableDemo implements Callable<Integer>
{
@Override
public Integer call() throws Exception
{
int sum = 0;
for (int i = 0;i<100000;i++){
sum+=1;
System.out.println(sum);
}
return sum;
}
}
结果:结果是在计算结束后才获取到