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-08
java發(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í)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11
java volatile關(guān)鍵字作用及使用場(chǎng)景詳解
在本文里我們給大家分享的是關(guān)于java volatile關(guān)鍵字作用及使用場(chǎng)景的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-08-08
Java實(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)題和完美解決辦法

