最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java多線程中Callable和Future的解讀

 更新時(shí)間:2023年09月14日 10:58:43   作者:尋道的?Programmer  
這篇文章主要介紹了Java多線程中Callable和Future的解讀,Callable接口類似于Runnable,從名字就可以看出來了,但是Runnable不會(huì)返回結(jié)果,并且無法拋出返回結(jié)果的異常,而Callable功能更強(qiáng)大一些,被線程執(zhí)行后,可以返回值,這個(gè)返回值可以被Future拿到,需要的朋友可以參考下

Java的Callable和Future

本篇說明的是Callable和Future,它倆很有意思的,一個(gè)產(chǎn)生結(jié)果,一個(gè)拿到結(jié)果。

Callable接口類似于Runnable,從名字就可以看出來了,但是Runnable不會(huì)返回結(jié)果,并且無法拋出返回結(jié)果的異常,而Callable功能更強(qiáng)大一些,被線程執(zhí)行后,可以返回值,這個(gè)返回值可以被Future拿到,也就是說,F(xiàn)uture可以拿到異步執(zhí)行任務(wù)的返回值,下面來看一個(gè)簡(jiǎn)單的例子:

public class CallableAndFuture {
	public static void main(String[] args) {
		Callable<Integer> callable = new Callable<Integer>() {
			public Integer call() throws Exception {
				return new Random().nextInt(100);
			}
		};
		FutureTask<Integer> future = new FutureTask<Integer>(callable);
		new Thread(future).start();
		try {
			Thread.sleep(5000);// 可能做一些事情
			System.out.println(future.get());
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
	}
}

FutureTask實(shí)現(xiàn)了兩個(gè)接口,Runnable和Future,所以它既可以作為Runnable被線程執(zhí)行,又可以作為Future得到Callable的返回值,那么這個(gè)組合的使用有什么好處呢?

假設(shè)有一個(gè)很耗時(shí)的返回值需要計(jì)算,并且這個(gè)返回值不是立刻需要的話,那么就可以使用這個(gè)組合,用另一個(gè)線程去計(jì)算返回值,而當(dāng)前線程在使用這個(gè)返回值之前可以做其它的操作,等到需要這個(gè)返回值時(shí),再通過Future得到,豈不美哉!這里有一個(gè)Future模式的介紹://openhome.cc/Gossip/DesignPattern/FuturePattern.htm。

下面來看另一種方式使用Callable和Future,通過ExecutorService的submit方法執(zhí)行Callable,并返回Future,代碼如下:

public class CallableAndFuture {
	public static void main(String[] args) {
		ExecutorService threadPool = Executors.newSingleThreadExecutor();
		Future<Integer> future = threadPool.submit(new Callable<Integer>() {
			public Integer call() throws Exception {
				return new Random().nextInt(100);
			}
		});
		try {
			Thread.sleep(5000);// 可能做一些事情
			System.out.println(future.get());
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
	}
}

代碼是不是簡(jiǎn)化了很多,ExecutorService繼承自Executor,它的目的是為我們管理Thread對(duì)象,從而簡(jiǎn)化并發(fā)編程,Executor使我們無需顯示的去管理線程的生命周期,是JDK 5之后啟動(dòng)任務(wù)的首選方式。

執(zhí)行多個(gè)帶返回值的任務(wù),并取得多個(gè)返回值,代碼如下:

public class CallableAndFuture {
	public static void main(String[] args) {
		ExecutorService threadPool = Executors.newCachedThreadPool();
		CompletionService<Integer> cs = new ExecutorCompletionService<Integer>(threadPool);
		for(int i = 1; i < 5; i++) {
			final int taskID = i;
			cs.submit(new Callable<Integer>() {
				public Integer call() throws Exception {
					return taskID;
				}
			});
		}
		// 可能做一些事情
		for(int i = 1; i < 5; i++) {
			try {
				System.out.println(cs.take().get());
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (ExecutionException e) {
				e.printStackTrace();
			}
		}
	}
} 

其實(shí)也可以不使用CompletionService,可以先創(chuàng)建一個(gè)裝Future類型的集合,用Executor提交的任務(wù)返回值添加到集合中,最后遍歷集合取出數(shù)據(jù),代碼略。

這里再闡述一下:提交到CompletionService中的Future是按照完成的順序排列的,這種做法中Future是按照添加的順序排列的。所以這兩種方式的區(qū)別就像評(píng)論中fishjam**所描述的那樣。

到此這篇關(guān)于Java多線程中Callable和Future的解讀的文章就介紹到這了,更多相關(guān)Java的Callable和Future內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis如何返回某列的最大值

    mybatis如何返回某列的最大值

    這篇文章主要介紹了mybatis如何返回某列的最大值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringCloud Bus如何實(shí)現(xiàn)配置刷新

    SpringCloud Bus如何實(shí)現(xiàn)配置刷新

    這篇文章主要介紹了SpringCloud Bus如何實(shí)現(xiàn)配置刷新,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • java中timer的schedule和scheduleAtFixedRate方法區(qū)別詳解

    java中timer的schedule和scheduleAtFixedRate方法區(qū)別詳解

    這篇文章主要為大家詳細(xì)介紹了java中timer的schedule和scheduleAtFixedRate方法區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java中的Web MVC簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java中的Web MVC簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    MVC模型是一種架構(gòu)型的模式,本身不引入新功能,只是幫助我們將開發(fā)的結(jié)構(gòu)組織的更加合理,使展示與模型分離、流程控制邏輯、業(yè)務(wù)邏輯調(diào)用與展示邏輯分離
    2017-09-09
  • SpringBoot集成slf4j日志配置的方法

    SpringBoot集成slf4j日志配置的方法

    本文主要介紹了SpringBoot集成slf4j日志配置的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • java打印菱形及直角和等腰三角形的方法

    java打印菱形及直角和等腰三角形的方法

    用Java輸出菱形本身是一個(gè)比較簡(jiǎn)單的問題,這是Java初學(xué)者都要編寫的一個(gè)算法,下面這篇文章主要給大家介紹了關(guān)于java打印菱形及直角和等腰三角形的方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 詳解微信小程序 同步異步解決辦法

    詳解微信小程序 同步異步解決辦法

    這篇文章主要介紹了詳解微信小程序 同步異步解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Java利用跳躍表解決雙重隊(duì)列問題詳解

    Java利用跳躍表解決雙重隊(duì)列問題詳解

    這篇文章主要為大家詳細(xì)介紹了Java如何利用跳躍表來解決雙重隊(duì)列的問題。本文通過一個(gè)簡(jiǎn)單的例題進(jìn)行了講解,感興趣的小伙伴可以了解一下
    2022-12-12
  • java連接SQL Server數(shù)據(jù)庫的方法

    java連接SQL Server數(shù)據(jù)庫的方法

    這篇文章主要為大家詳細(xì)介紹了java連接SQL Server數(shù)據(jù)庫的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Java 8中日期和時(shí)間的處理方法

    Java 8中日期和時(shí)間的處理方法

    Java 8新增了LocalDate和LocalTime接口,接下來通過本文給大家介紹Java 8中日期和時(shí)間的處理方法,非常不錯(cuò),感興趣的朋友一起看下吧
    2016-08-08

最新評(píng)論

芜湖市| 廊坊市| 武汉市| 方山县| 永春县| 无极县| 仁寿县| 平安县| 宁河县| 蓬安县| 板桥市| 普格县| 丽江市| 安龙县| 晴隆县| 龙海市| 府谷县| 东乡族自治县| 平江县| 雷山县| 资阳市| 皮山县| 石泉县| 建宁县| 安吉县| 堆龙德庆县| 靖安县| 高唐县| 铁岭市| 科尔| 遵义县| 玉山县| 蛟河市| 育儿| 赤壁市| 连城县| 伊金霍洛旗| 衡阳县| 北票市| 云和县| 察雅县|