java面試常問(wèn)的Runnable和Callable的區(qū)別
Runnable
Runnable接口非常簡(jiǎn)單,就定義了一個(gè)方法run(), 實(shí)現(xiàn)Runnable接口的run方法就可以實(shí)現(xiàn)多線(xiàn)程
// 函數(shù)式接口 @FunctionalInterface public interface Runnable { public abstract void run(); }
Callable
可能很多人都知道要想在多線(xiàn)程中獲取異步返回值結(jié)果一般是用Callable和FutureTask接口來(lái)實(shí)現(xiàn),但可能很多人都不知道其實(shí)Callable是依賴(lài)于Runnable的run方法進(jìn)行執(zhí)行任務(wù)的,然后在通過(guò)FutureTask來(lái)收集返回值結(jié)果,下面咱們就自己模擬寫(xiě)一份FutureTask代碼來(lái)看看是怎么實(shí)現(xiàn)的吧。
/** * @author yinfeng * @description 自己實(shí)現(xiàn)futureTask,基于park/unpark進(jìn)行線(xiàn)程通訊 * @since 2022/1/9 21:32 */ public class MyFutureTask<T> implements Runnable { Callable<T> callable; /** * callable執(zhí)行結(jié)果 */ T result; /** * task執(zhí)行狀態(tài) */ String state = "new"; /** * 存儲(chǔ)正在等待的消費(fèi)者 */ LinkedBlockingQueue<Thread> waiters = new LinkedBlockingQueue<>(); public MyFutureTask(Callable<T> callable) { this.callable = callable; } @Override public void run() { try { result = callable.call(); } catch (Exception e) { e.printStackTrace(); } finally { state = "end"; } // 任務(wù)執(zhí)行完成后通過(guò)unpark通知消費(fèi)者 System.out.println(Thread.currentThread().getName() + " 生產(chǎn)者執(zhí)行結(jié)束,通知消費(fèi)者"); while (true) { Thread waiter = waiters.poll(); if (waiter == null) { break; } LockSupport.unpark(waiter); } } /** * park / unpark */ public T get() throws Exception { Thread mainThread = Thread.currentThread(); // 塞入等待的集合中 waiters.add(mainThread); // 判斷狀態(tài) System.out.println(Thread.currentThread().getName() + " 消費(fèi)者進(jìn)入等待"); while (!"end".equals(state)) { // 阻塞等待任務(wù)執(zhí)行完成后通知 LockSupport.park(mainThread); } return result; } }
我們寫(xiě)個(gè)demo測(cè)試一下
/** * @author yinfeng * @description * @since 2022/1/9 21:32 */ public class FutureTaskTest { public static void main(String[] args) throws Exception { final MyFutureTask<String> futureTask = new MyFutureTask<>(() -> { Thread.sleep(5000); return "任務(wù)完成888"; }); new Thread(futureTask).start(); final String result = futureTask.get(); System.out.println("結(jié)果:"+result); // 控制臺(tái)打印如下: // main 消費(fèi)者進(jìn)入等待 // Thread-0 生產(chǎn)者執(zhí)行結(jié)束,通知消費(fèi)者 // 結(jié)果:任務(wù)完成888 } }
可以看到我們的demo也是正常運(yùn)行的,所以很關(guān)鍵的一點(diǎn)還是Callable是依賴(lài)于Runnable的run方法進(jìn)行執(zhí)行任務(wù)的
到此這篇關(guān)于java面試常問(wèn)的Runnable和Callable的區(qū)別的文章就介紹到這了,更多相關(guān)java Runnable和Callable區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java使用多線(xiàn)程批次查詢(xún)大量數(shù)據(jù)(Callable返回?cái)?shù)據(jù))方式
- Java通過(guò)Callable實(shí)現(xiàn)多線(xiàn)程
- Java多線(xiàn)程中Callable和Future的解讀
- Java中的Callable實(shí)現(xiàn)多線(xiàn)程詳解
- Java使用Callable接口實(shí)現(xiàn)多線(xiàn)程的實(shí)例代碼
- Java多線(xiàn)程實(shí)現(xiàn)之Callable詳解
- Java中Runnable和Callable分別什么時(shí)候使用
- Java中Runnable與Callable接口的區(qū)別詳解
- 詳解Java中Callable和Future的區(qū)別
- Java使用Runnable和Callable實(shí)現(xiàn)多線(xiàn)程的區(qū)別詳解
- Java并發(fā)教程之Callable和Future接口詳解
- Java中callable的實(shí)現(xiàn)原理
相關(guān)文章
SpringBoot Knife4j在線(xiàn)API文檔框架基本使用
knife4j是為Java MVC框架集成Swagger生成Api文檔的增強(qiáng)解決方案,這篇文章主要介紹了SpringBoot中使用Knife4J在線(xiàn)API文檔框架,需要的朋友可以參考下2022-12-12springboot集成opencv實(shí)現(xiàn)人臉識(shí)別功能的詳細(xì)步驟
大家都知道OpenCV是一個(gè)基于BSD許可(開(kāi)源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)軟件庫(kù),可以運(yùn)行在Linux、Windows、Android和Mac OS操作系統(tǒng)上今天通過(guò)本文給大家分享springboot集成opencv實(shí)現(xiàn)人臉識(shí)別,感興趣的朋友一起看看吧2021-06-06Plugin ‘org.springframework.boot:spring-boot-maven-plug
這篇文章給大家介紹了Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found的解決方案,親測(cè)可用,文中給出了兩種解決方法,需要的朋友可以參考下2024-01-01了解Maven的<relativePath/>標(biāo)簽用法
這篇文章主要介紹了了解Maven的<relativePath/>標(biāo)簽用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04全面匯總SpringBoot和SpringClould常用注解
Java注解是附加在代碼中的一些元信息,用于一些工具在編譯、運(yùn)行時(shí)進(jìn)行解析和使用,起到說(shuō)明、配置的功能,這篇文章就帶你來(lái)了解一下2021-08-08如何用idea數(shù)據(jù)庫(kù)編寫(xiě)快遞e站
這篇文章主要介紹了如何用idea數(shù)據(jù)庫(kù)編寫(xiě)快遞e站,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Java中MyBatis Plus知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理一篇關(guān)于Java中MyBatis Plus知識(shí)點(diǎn)總結(jié),需要的朋友們參考下。2019-10-10使用maven-archetype-plugin現(xiàn)有項(xiàng)目生成腳手架的方法
這篇文章主要介紹了使用maven-archetype-plugin現(xiàn)有項(xiàng)目生成腳手架的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11