java callable 详解_Java多线程详解(七)------Callable接口介绍

本文详细介绍了Java中Callable接口与Runnable接口的区别,并通过实例展示了Callable接口的使用方法。重点讲解了FutureTask,解释了其作为异步计算结果的容器,如何解决调用挂起堵塞的问题。文中还提供了代码示例,演示了如何在多线程环境中使用FutureTask获取并处理计算结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、与runnable接口对比

1 创建新类MyThread实现runnable接口2 class MyThread implementsRunnable{3 @Override4 public voidrun() {5

6 }7 }8 新类MyThread2实现callable接口9 class MyThread2 implements Callable{10 @Override11 public Integer call() throwsException {12 return 200;13 }14 }15 面试题:callable接口与runnable接口的区别?16

17 答:(1)是否有返回值18 (2)是否抛异常19 (3)落地方法不一样,一个是run,一个是call20

21

22

23

二、如何使用

7ec1041c7288bbe2554ad82215f48d4b.png

不可行,因为:thread类的构造方法根本没有Callable

52314ee351e7723b0e0c54bf7fc48c34.png

FutureTask ft = new FutureTask(new MyThread());

new Thread(ft, "AA").start();

运行成功后如何获得返回值?

db359bd49ad1fbd49e507390b8f8af99.png

ft.get();

三、FutureTask

是什么

未来的任务,用它就干一件事,异步调用

main方法就像一个冰糖葫芦,一个个方法由main串起来。

但解决不了一个问题:正常调用挂起堵塞问题

a3ef1ddd03e9e6540efa6b8b2ee9c97f.png

在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给Future对象在后台完成,

当主线程将来需要时,就可以通过Future对象获得后台作业的计算结果或者执行状态。

一般FutureTask多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。

仅在计算完成时才能检索结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,

就不能再重新开始或取消计算。get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,

然后会返回结果或者抛出异常。

只计算一次

get方法放到最后

代码:

1 packagecom.study.callable;2

3

4 importjava.util.concurrent.Callable;5 importjava.util.concurrent.FutureTask;6 importjava.util.concurrent.TimeUnit;7

8 class MyThread implementsRunnable {9 @Override10 public voidrun() {11 }12 }13

14 class MyThread2 implements Callable{15 @Override16 public Integer call() throwsException {17 System.out.println(Thread.currentThread().getName() + " come in callable");18 return 200;19 }20 }21

22 public classCallableDemo {23 public static void main(String[] args) throwsException {24 //FutureTask futureTask = new FutureTask<>(new MyThread2());25 //new Thread(futureTask,"zhang3").start();//传入futureTask对象26 //System.out.println(futureTask.get());27 //28 FutureTask ft1 = new FutureTask(() ->{29 System.out.println(Thread.currentThread().getName() + " come in callable");30 TimeUnit.SECONDS.sleep(4);31 return 1024;32 });33 FutureTask ft2 = new FutureTask(() ->{34 System.out.println(Thread.currentThread().getName() + " come in callable");35 TimeUnit.SECONDS.sleep(4);36 return 2048;37 });38 //启动线程

39 new Thread(ft1, "zhang3").start();40 new Thread(ft2, "li4").start();41

42 System.out.println(ft1.get());43 System.out.println(ft2.get());44

45 /**

46 *47 *48 在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给Future对象在后台完成,49 当主线程将来需要时,就可以通过Future对象获得后台作业的计算结果或者执行状态。50

51 一般FutureTask多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。52

53 仅在计算完成时才能检索结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,54 就不能再重新开始或取消计算。get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,55 然后会返回结果或者抛出异常。56

57 只计算一次58 get方法放到最后59 */

60 }61 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值