Callable接口

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 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()接口";
    }
}
复制代码

 

 

4.futureTask.get( ),可能会存在阻塞 , 解决方法放在运行代码的最下面

 

posted @   ShamUnite  阅读(160)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示