Java多線(xiàn)程實(shí)現(xiàn)之Callable詳解
Java多線(xiàn)程實(shí)現(xiàn)之Callable接口
(1)java.util.concurrent.Callable是一個(gè)泛型接口,只有一個(gè)call()方法
(2)call()方法拋出異常Exception異常,且返回一個(gè)指定的泛型類(lèi)對(duì)象
例1:利用Callable接口創(chuàng)建子線(xiàn)程類(lèi):
package com.my.frame; import java.util.concurrent.Callable; public class ThreadCall implements Callable<String> { @Override public String call() throws Exception { // TODO Auto-generated method stub System.out.println("====="); return "9999"; } } package com.my.frame; import java.util.concurrent.FutureTask; public class TestThread { public static void main(String[] args) { FutureTask<String> ft = new FutureTask<>(new ThreadCall()); new Thread(ft).start(); } }
例2:
Callable<String> callable = new Callable<String>() { @Override public String call() throws Exception { try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } return "成功"; } }; ExecutorService executorService = Executors.newCachedThreadPool(); Future<String> future = executorService.submit(callable); String result = null; try { result = future.get(); } catch (ExecutionException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("result:" + result);
Callable 與 Runnable
都是以 able 結(jié)束,可以開(kāi)啟線(xiàn)程
Callable 有返回值
那么現(xiàn)在就有一個(gè)問(wèn)題,子現(xiàn)場(chǎng)是耗時(shí)操作的,他的返回值返回給誰(shuí)用呢,主線(xiàn)程如何不阻塞的情況下拿到子線(xiàn)程的返回值呢?
我們接下來(lái)解釋這個(gè)問(wèn)題
首先,executorService.submit(callable) 中,executor 調(diào)用的不是 execute(callable) 而是 submit(callable)
然后配合 future.get() 去取值,這里的取值,是阻塞式的,能保證我們值的可靠性,這是 Java 在 API 層能做到的上限了。
其中,future 提供一種方法讓主線(xiàn)程能夠主動(dòng)去詢(xún)問(wèn)后臺(tái)線(xiàn)程是否執(zhí)行完畢,他就是:future.isDone()
到此這篇關(guān)于Java多線(xiàn)程實(shí)現(xiàn)之Callable詳解的文章就介紹到這了,更多相關(guān)Java多線(xiàn)程Callable內(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中Runnable和Callable分別什么時(shí)候使用
- Java中Runnable與Callable接口的區(qū)別詳解
- 詳解Java中Callable和Future的區(qū)別
- Java使用Runnable和Callable實(shí)現(xiàn)多線(xiàn)程的區(qū)別詳解
- java面試常問(wèn)的Runnable和Callable的區(qū)別
- Java并發(fā)教程之Callable和Future接口詳解
- Java中callable的實(shí)現(xiàn)原理
相關(guān)文章
Java刪除指定文件夾下的所有內(nèi)容的方法(包括此文件夾)
下面小編就為大家?guī)?lái)一篇Java刪除指定文件夾下的所有內(nèi)容的方法(包括此文件夾) 。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12Java實(shí)現(xiàn)郵件發(fā)送的過(guò)程及代碼詳解
這篇文章主要介紹了Java實(shí)現(xiàn)郵件發(fā)送的過(guò)程及代碼詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Java8 新特性之日期時(shí)間對(duì)象及一些其他特性
這篇文章主要介紹了Java8 新特性之日期時(shí)間對(duì)象及一些其他特性,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01springboot發(fā)送郵件功能的實(shí)現(xiàn)代碼
發(fā)郵件是一個(gè)很常見(jiàn)的功能,在java中實(shí)現(xiàn)需要依靠JavaMailSender這個(gè)接口,今天通過(guò)本文給大家分享springboot發(fā)送郵件功能的實(shí)現(xiàn)代碼,感興趣的朋友跟隨小編一起看看吧2021-07-07如何使用jakarta.json進(jìn)行json序列化和反序列化
java里,json框架何其多,常見(jiàn)的有jackson、fastjson、gson等,本文重點(diǎn)介紹如何使用jakarta.json進(jìn)行json序列化和反序列化,需要的朋友可以參考下,2024-07-07Maven中的dependencyManagement 實(shí)例詳解
dependencyManagement的中文意思就是依賴(lài)關(guān)系管理,它就是為了能通更好統(tǒng)一管理項(xiàng)目的版本號(hào)和各種jar版本號(hào),可以更加方便升級(jí),解決包沖突問(wèn)題,這篇文章主要介紹了Maven中的dependencyManagement 實(shí)例詳解,需要的朋友可以參考下2024-02-02SpringBoot?整合ChatGPT?API項(xiàng)目實(shí)戰(zhàn)教程
這篇文章主要介紹了SpringBoot整合ChatGPT API項(xiàng)目實(shí)戰(zhàn)教程,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05