Java通過Callable實現(xiàn)多線程
Callable實現(xiàn)多線程
在java.util.concurrent包下,相比較于通過實現(xiàn)Runnable接口的run方法來實現(xiàn)多線程,優(yōu)點在于可以有返回值,可以拋出異常,因為run方法是void的,并且不能拋出異常,但是Callable的方式缺點在于較為繁瑣。
Callable的任務(wù)執(zhí)行后可返回值,運行Callable任務(wù)可以拿到一個Future對象。Future表示異步計算的結(jié)果。它提供了檢查計算是否完成的方法,以等待計算的完成,并檢查計算的結(jié)果。通過Future對象可以了解任務(wù)的執(zhí)行情況,可以取消任務(wù)的執(zhí)行,還可以獲取任務(wù)的執(zhí)行結(jié)果。
思路:
(1)創(chuàng)建Callable實現(xiàn)類+重寫call方法;
(2)借助執(zhí)行調(diào)度服務(wù)ExecutorService,獲取Future對象
ExecutorService ser = Executors.newFixedThreadPool(2); Future result = ser.submit(實現(xiàn)類對象)
(3)獲取result.get();
(4)停止服務(wù)ser.shutdownNow();
下面是一個小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;//延時時間
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通過Callable實現(xiàn)多線程的文章就介紹到這了,更多相關(guān)Callable實現(xiàn)多線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java使用多線程批次查詢大量數(shù)據(jù)(Callable返回數(shù)據(jù))方式
- Java多線程中Callable和Future的解讀
- Java中的Callable實現(xiàn)多線程詳解
- Java使用Callable接口實現(xiàn)多線程的實例代碼
- Java多線程實現(xiàn)之Callable詳解
- Java中Runnable和Callable分別什么時候使用
- Java中Runnable與Callable接口的區(qū)別詳解
- 詳解Java中Callable和Future的區(qū)別
- Java使用Runnable和Callable實現(xiàn)多線程的區(qū)別詳解
- java面試常問的Runnable和Callable的區(qū)別
- Java并發(fā)教程之Callable和Future接口詳解
- Java中callable的實現(xiàn)原理
相關(guān)文章
javacv-ffmpeg ProcessBuilder批量旋轉(zhuǎn)圖片方式
為了批量處理大量圖片的旋轉(zhuǎn),可以使用javacv-ffmpeg結(jié)合ProcessBuilder,首先在maven配置文件中添加ffmpeg及javacpp依賴,javacpp支持調(diào)用C/C++方法,而ffmpeg基于C語言,使用ProcessBuilder創(chuàng)建進(jìn)程調(diào)用ffmpeg方法2024-09-09
java開發(fā)ExecutorService監(jiān)控實現(xiàn)示例詳解
這篇文章主要為大家介紹了java開發(fā)ExecutorService監(jiān)控實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
網(wǎng)關(guān)Spring Cloud Gateway HTTP超時配置問題
這篇文章主要介紹了網(wǎng)關(guān)Spring Cloud Gateway HTTP超時配置問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
SpringBoot整合sharding-jdbc?實現(xiàn)分庫分表操作的示例代碼
在Spring?Boot中使用ShardingSphere的Sharding-JDBC來實現(xiàn)數(shù)據(jù)庫的分庫分表是一個常見的需求,下面就拉具體介紹一下實現(xiàn)步驟,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04
Spring Boot 與 Tomcat 錯誤頁面處理機制全面解析
本文給大家介紹Spring Boot 如何與內(nèi)嵌 Tomcat 協(xié)作,實現(xiàn)高效、靈活的錯誤頁面處理機制,通過分析核心源碼,我們將揭示這一機制背后的設(shè)計哲學(xué)和實現(xiàn)細(xì)節(jié),感興趣的朋友跟隨小編一起看看吧2024-12-12
BeanUtils.copyProperties()屬性名相同但是類型不同問題
這篇文章主要介紹了BeanUtils.copyProperties()屬性名相同但是類型不同問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-09-09

