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