Callable接口
特点
1.有返回
2.可以抛出异常
代码实现,Callable接口开启线程
public class CallableTest { public static void main(String[] args) throws ExecutionException, InterruptedException { MyThread thread = new MyThread(); FutureTask futureTask = new FutureTask<>(thread); new Thread(futureTask).start();//这里只能接收runnable接口,所以通过中间商(FutureTask)进行转换 String str =(String)futureTask.get(); //可能产生阻塞 System.out.println(str); } }
class MyThread implements Callable { @Override public String call() throws Exception { System.out.println("call()"); return "这是一个callable()接口"; } }
FutureTask futureTask = new FutureTask<>(thread);
由于Thread的开启使用的是runnable接口实现,所以这里不能直接调用callable接口,需要通过中间商FutureTask起到承接作用
Runnable和Callable的区别
1.实现方法不同 run( ) / call( )
2.callable有返回值,并且抛出异常
3.callable存在缓存机制,开启多个线程的情况下只会返回一个值,目的是提高效率
public class CallableTest { public static void main(String[] args) throws ExecutionException, InterruptedException { MyThread thread = new MyThread(); FutureTask futureTask = new FutureTask<>(thread); new Thread(futureTask,"A" ).start();//这里只能接收runnable接口,所以通过中间商(FutureTask)进行转换 new Thread(futureTask,"B").start(); } }
class MyThread implements Callable { @Override public String call() throws Exception { System.out.println("call()"); return "这是一个callable()接口"; } }