Java并行编程中的“可调用”与“可运行”任务
當(dāng)我們用Java編寫(xiě)多線(xiàn)程應(yīng)用程序時(shí),我們傾向于使用“ Runnable ”接口來(lái)實(shí)現(xiàn)線(xiàn)程類(lèi)。
您的類(lèi)必須簡(jiǎn)單地實(shí)現(xiàn)此接口并覆蓋run方法。
對(duì)于瑣碎的用例,我們可以通過(guò)調(diào)用“ start”方法直接啟動(dòng)線(xiàn)程,結(jié)果將控制流委托給run方法。
但是,在大多數(shù)應(yīng)用程序中,我們最終使用線(xiàn)程池,該線(xiàn)程池管理工作線(xiàn)程并在任務(wù)提交到池時(shí)促進(jìn)任務(wù)執(zhí)行。
Java提供了各種各樣的線(xiàn)程池,并且還允許程序員創(chuàng)建自己的線(xiàn)程池實(shí)現(xiàn)。
將線(xiàn)程任務(wù)提交給池的過(guò)程也很標(biāo)準(zhǔn)。
在某些情況下,我們可能希望我們的線(xiàn)程做更多的事情,而不是僅僅執(zhí)行一個(gè)任務(wù)。
在這種情況下,了解使用Runnable vs Callable的用例很重要。
1.從執(zhí)行線(xiàn)程返回值
在許多情況下,您可能希望從執(zhí)行線(xiàn)程返回一個(gè)值。
這是“可調(diào)用”任務(wù)派上用場(chǎng)的地方。
Java ExecutorService API允許接受Callable類(lèi)型的任務(wù),并返回“ Future”任務(wù)。
這對(duì)于某些用例可能很有用。
但是,下面給出了使用Callable的更重要的選擇之一。
2.能夠從執(zhí)行線(xiàn)程中拋出檢查異常
Callable的重要考慮因素之一是程序員具有從執(zhí)行線(xiàn)程中引發(fā)異常的能力。
這可以從我們的多線(xiàn)程應(yīng)用程序中處理異常,并可以從異常中正常恢復(fù)。
如果我們查看“調(diào)用”方法的簽名,就會(huì)發(fā)現(xiàn)它引發(fā)了一個(gè)通用異常–
V call()引發(fā)異常
3.其他方案
Callable接口實(shí)現(xiàn)也可以與FutureTask結(jié)合使用。
FutureTask類(lèi)接受Callable實(shí)現(xiàn)。
FutureTask可以提交給線(xiàn)程池執(zhí)行器,我們可以使用標(biāo)準(zhǔn)的Future API檢索執(zhí)行結(jié)果。
下面的代碼段
public class CallableInsideFutureTask{public static void main(String[] args){ExecutorService executor = Executors.newSingleThreadExecutor();FutureTask<String> myTask = new MyTask(new CallableTest());executor.submit(myTask);try {myTask.get();} catch (Exception ex ) {ex.printStackTrace();}executor.shutdownNow();}}在此示例中, CallableTest類(lèi)必須實(shí)現(xiàn)Callable接口。
如果您喜歡這篇文章,請(qǐng)隨時(shí)在LinkedIn上進(jìn)行連接。
翻譯自: https://www.javacodegeeks.com/2019/04/callable-runnable-tasks-java-concurrent-programming.html
總結(jié)
以上是生活随笔為你收集整理的Java并行编程中的“可调用”与“可运行”任务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 每个人都在谈论硒替代品-明智地选择!
- 下一篇: Java是发展的垫脚石。 学习吧!