Java通過Callable實現(xiàn)多線程
Callable實現(xiàn)多線程
在java.util.concurrent包下,相比較于通過實現(xiàn)Runnable接口的run方法來實現(xiàn)多線程,優(yōu)點在于可以有返回值,可以拋出異常,因為run方法是void的,并且不能拋出異常,但是Callable的方式缺點在于較為繁瑣。
Callable的任務執(zhí)行后可返回值,運行Callable任務可以拿到一個Future對象。Future表示異步計算的結(jié)果。它提供了檢查計算是否完成的方法,以等待計算的完成,并檢查計算的結(jié)果。通過Future對象可以了解任務的執(zhí)行情況,可以取消任務的執(zhí)行,還可以獲取任務的執(zhí)行結(jié)果。
思路:
(1)創(chuàng)建Callable實現(xiàn)類+重寫call方法;
(2)借助執(zhí)行調(diào)度服務ExecutorService,獲取Future對象
ExecutorService ser = Executors.newFixedThreadPool(2); Future result = ser.submit(實現(xiàn)類對象)
(3)獲取result.get();
(4)停止服務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);
// 停止服務
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)文章
Spring Boot自定義favicon實現(xiàn)方法實例解析
這篇文章主要介紹了Spring Boot自定義favicon實現(xiàn)方法實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08
java發(fā)送HttpClient請求及接收請求結(jié)果過程的簡單實例
下面小編就為大家?guī)硪黄猨ava發(fā)送HttpClient請求及接收請求結(jié)果過程的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11
java volatile關(guān)鍵字作用及使用場景詳解
在本文里我們給大家分享的是關(guān)于java volatile關(guān)鍵字作用及使用場景的相關(guān)知識點內(nèi)容,需要的朋友們學習下。2019-08-08
Java實現(xiàn)對字符串中的數(shù)值進行排序操作示例
這篇文章主要介紹了Java實現(xiàn)對字符串中的數(shù)值進行排序操作,涉及java字符串與數(shù)組的相互轉(zhuǎn)換以及數(shù)組排序相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
詳解java中的PropertyChangeSupport與PropertyChangeListener
這篇文章主要介紹了詳解java中的PropertyChangeSupport與PropertyChangeListener的相關(guān)資料,需要的朋友可以參考下2017-09-09
IntelliJ IDEA 無法正常使用SVN的問題和完美解決辦法
這篇文章主要介紹了IntelliJ IDEA 無法正常使用SVN的問題和解決辦法,本文給大家分享完美解決方案,通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08

