java callable 详解_Java多线程详解(七)------Callable接口介绍
一、與runnable接口對(duì)比
1 創(chuàng)建新類MyThread實(shí)現(xiàn)runnable接口2 class MyThread implementsRunnable{3 @Override4 public voidrun() {5
6 }7 }8 新類MyThread2實(shí)現(xiàn)callable接口9 class MyThread2 implements Callable{10 @Override11 public Integer call() throwsException {12 return 200;13 }14 }15 面試題:callable接口與runnable接口的區(qū)別?16
17 答:(1)是否有返回值18 (2)是否拋異常19 (3)落地方法不一樣,一個(gè)是run,一個(gè)是call20
21
22
23
二、如何使用
不可行,因?yàn)?#xff1a;thread類的構(gòu)造方法根本沒(méi)有Callable
FutureTask ft = new FutureTask(new MyThread());
new Thread(ft, "AA").start();
運(yùn)行成功后如何獲得返回值?
ft.get();
三、FutureTask
是什么
未來(lái)的任務(wù),用它就干一件事,異步調(diào)用
main方法就像一個(gè)冰糖葫蘆,一個(gè)個(gè)方法由main串起來(lái)。
但解決不了一個(gè)問(wèn)題:正常調(diào)用掛起堵塞問(wèn)題
在主線程中需要執(zhí)行比較耗時(shí)的操作時(shí),但又不想阻塞主線程時(shí),可以把這些作業(yè)交給Future對(duì)象在后臺(tái)完成,
當(dāng)主線程將來(lái)需要時(shí),就可以通過(guò)Future對(duì)象獲得后臺(tái)作業(yè)的計(jì)算結(jié)果或者執(zhí)行狀態(tài)。
一般FutureTask多用于耗時(shí)的計(jì)算,主線程可以在完成自己的任務(wù)后,再去獲取結(jié)果。
僅在計(jì)算完成時(shí)才能檢索結(jié)果;如果計(jì)算尚未完成,則阻塞 get 方法。一旦計(jì)算完成,
就不能再重新開(kāi)始或取消計(jì)算。get方法而獲取結(jié)果只有在計(jì)算完成時(shí)獲取,否則會(huì)一直阻塞直到任務(wù)轉(zhuǎn)入完成狀態(tài),
然后會(huì)返回結(jié)果或者拋出異常。
只計(jì)算一次
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對(duì)象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 //啟動(dòng)線程
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 在主線程中需要執(zhí)行比較耗時(shí)的操作時(shí),但又不想阻塞主線程時(shí),可以把這些作業(yè)交給Future對(duì)象在后臺(tái)完成,49 當(dāng)主線程將來(lái)需要時(shí),就可以通過(guò)Future對(duì)象獲得后臺(tái)作業(yè)的計(jì)算結(jié)果或者執(zhí)行狀態(tài)。50
51 一般FutureTask多用于耗時(shí)的計(jì)算,主線程可以在完成自己的任務(wù)后,再去獲取結(jié)果。52
53 僅在計(jì)算完成時(shí)才能檢索結(jié)果;如果計(jì)算尚未完成,則阻塞 get 方法。一旦計(jì)算完成,54 就不能再重新開(kāi)始或取消計(jì)算。get方法而獲取結(jié)果只有在計(jì)算完成時(shí)獲取,否則會(huì)一直阻塞直到任務(wù)轉(zhuǎn)入完成狀態(tài),55 然后會(huì)返回結(jié)果或者拋出異常。56
57 只計(jì)算一次58 get方法放到最后59 */
60 }61 }
總結(jié)
以上是生活随笔為你收集整理的java callable 详解_Java多线程详解(七)------Callable接口介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql id还原_一次线上DB问题排
- 下一篇: java同步锁实例_Java lock同