Java通過(guò)Callable實(shí)現(xiàn)多線程
Callable實(shí)現(xiàn)多線程
在java.util.concurrent包下,相比較于通過(guò)實(shí)現(xiàn)Runnable接口的run方法來(lái)實(shí)現(xiàn)多線程,優(yōu)點(diǎn)在于可以有返回值,可以拋出異常,因?yàn)閞un方法是void的,并且不能拋出異常,但是Callable的方式缺點(diǎn)在于較為繁瑣。
Callable的任務(wù)執(zhí)行后可返回值,運(yùn)行Callable任務(wù)可以拿到一個(gè)Future對(duì)象。Future表示異步計(jì)算的結(jié)果。它提供了檢查計(jì)算是否完成的方法,以等待計(jì)算的完成,并檢查計(jì)算的結(jié)果。通過(guò)Future對(duì)象可以了解任務(wù)的執(zhí)行情況,可以取消任務(wù)的執(zhí)行,還可以獲取任務(wù)的執(zhí)行結(jié)果。
思路:
(1)創(chuàng)建Callable實(shí)現(xiàn)類+重寫call方法;
(2)借助執(zhí)行調(diào)度服務(wù)ExecutorService,獲取Future對(duì)象
ExecutorService ser = Executors.newFixedThreadPool(2); Future result = ser.submit(實(shí)現(xiàn)類對(duì)象)
(3)獲取result.get();
(4)停止服務(wù)ser.shutdownNow();
下面是一個(gè)小demo,龜兔賽跑的例子:
package multi_Thread; import java.util.concurrent.*; /** * 使用Callable創(chuàng)建線程 * Created by dd on 2016/6/4 0004. */ public class demo01 { public static void main(String[] args) throws ExecutionException, InterruptedException { // 創(chuàng)建線程 ExecutorService ser = Executors.newFixedThreadPool(2); Race tortoise = new Race("烏龜",1000); Race rabbit = new Race("兔子",500); Future<Integer> result1 = ser.submit(tortoise); Future<Integer> result2 = ser.submit(rabbit); Thread.sleep(2000); tortoise.setFlag(false); rabbit.setFlag(false); // 獲取值 Integer num1 = result1.get(); Integer num2 = result2.get(); System.out.println("烏龜"+num1); System.out.println("兔子"+num2); // 停止服務(wù) ser.shutdownNow(); } } class Race implements Callable<Integer>{ private String name;//名稱 private long time;//延時(shí)時(shí)間 private boolean flag = true; private int step = 0; public Race() { } public Race(String name) { super(); this.name = name; } public Race(String name, long time) { super(); this.name = name; this.time = time; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getTime() { return time; } public void setTime(long time) { this.time = time; } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } public int getStep() { return step; } public void setStep(int step) { this.step = step; } @Override public Integer call() throws Exception { while (flag){ Thread.sleep(time); step++; } return step; } }
到此這篇關(guān)于Java通過(guò)Callable實(shí)現(xiàn)多線程的文章就介紹到這了,更多相關(guān)Callable實(shí)現(xiàn)多線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java使用多線程批次查詢大量數(shù)據(jù)(Callable返回?cái)?shù)據(jù))方式
- Java多線程中Callable和Future的解讀
- Java中的Callable實(shí)現(xiàn)多線程詳解
- Java使用Callable接口實(shí)現(xiàn)多線程的實(shí)例代碼
- Java多線程實(shí)現(xiàn)之Callable詳解
- Java中Runnable和Callable分別什么時(shí)候使用
- Java中Runnable與Callable接口的區(qū)別詳解
- 詳解Java中Callable和Future的區(qū)別
- Java使用Runnable和Callable實(shí)現(xiàn)多線程的區(qū)別詳解
- java面試常問(wèn)的Runnable和Callable的區(qū)別
- Java并發(fā)教程之Callable和Future接口詳解
- Java中callable的實(shí)現(xiàn)原理
相關(guān)文章
Spring Boot自定義favicon實(shí)現(xiàn)方法實(shí)例解析
這篇文章主要介紹了Spring Boot自定義favicon實(shí)現(xiàn)方法實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08java發(fā)送HttpClient請(qǐng)求及接收請(qǐng)求結(jié)果過(guò)程的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇java發(fā)送HttpClient請(qǐng)求及接收請(qǐng)求結(jié)果過(guò)程的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11java volatile關(guān)鍵字作用及使用場(chǎng)景詳解
在本文里我們給大家分享的是關(guān)于java volatile關(guān)鍵字作用及使用場(chǎng)景的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-08-08Java實(shí)現(xiàn)對(duì)字符串中的數(shù)值進(jìn)行排序操作示例
這篇文章主要介紹了Java實(shí)現(xiàn)對(duì)字符串中的數(shù)值進(jìn)行排序操作,涉及java字符串與數(shù)組的相互轉(zhuǎn)換以及數(shù)組排序相關(guān)操作技巧,需要的朋友可以參考下2018-05-05

詳解java中的PropertyChangeSupport與PropertyChangeListener

IntelliJ IDEA 無(wú)法正常使用SVN的問(wèn)題和完美解決辦法