帶你快速搞定java多線(xiàn)程(2)
1、Future的類(lèi)圖結(jié)構(gòu),從整體上看下Future的結(jié)構(gòu)


首先看下future接口的函數(shù),共有5個(gè)方法。
get() 獲取執(zhí)行的結(jié)果,另外一個(gè)重載是有時(shí)間限制的get ,如果超時(shí)會(huì)有異常
isDone() 判斷future 結(jié)果是否處理完成
cancel 取消任務(wù)
2、future的使用,說(shuō)的再多都么什么用,來(lái)個(gè)例子悄悄怎么用的。
package thread;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* @author 香菜
*/
public class FutureTest {
private ExecutorService bossExecutor = Executors.newSingleThreadExecutor();
public Future<Integer> getHpTask(Integer input) {
return bossExecutor.submit(() -> {
System.out.println("Calculating..." + input);
Thread.sleep(1000);
return input * input;
});
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
Future<Integer> calculate = new FutureTest().getHpTask(100);
System.out.println(calculate.get());
System.out.println("Done");
}
}
3、通俗理解
future 就像是去買(mǎi)手抓餅,你把錢(qián)給老板之后,老板對(duì)你說(shuō)我做好了之后會(huì)放在旁邊的盤(pán)子里,而這個(gè)盤(pán)子就是future,你用isDone 判斷盤(pán)子里是不是有你要的手抓餅,有的話(huà)你就拿走。當(dāng)然你可以一直在那等著 get(),或者去做其他的事情,等會(huì)再來(lái)拿。
4、原理
看下
public V get() throws InterruptedException, ExecutionException {
int s = state;
if (s <= COMPLETING)
s = awaitDone(false, 0L);
return report(s);
}
private int awaitDone(boolean timed, long nanos)
throws InterruptedException {
final long deadline = timed ? System.nanoTime() + nanos : 0L;
WaitNode q = null;
boolean queued = false;
for (;;) {
if (Thread.interrupted()) {
removeWaiter(q);
throw new InterruptedException();
}
int s = state;
if (s > COMPLETING) {
if (q != null)
q.thread = null;
return s;
}
else if (s == COMPLETING) // cannot time out yet
Thread.yield();
else if (q == null)
q = new WaitNode();
else if (!queued)
queued = UNSAFE.compareAndSwapObject(this, waitersOffset,
q.next = waiters, q);
else if (timed) {
nanos = deadline - System.nanoTime();
if (nanos <= 0L) {
removeWaiter(q);
return state;
}
LockSupport.parkNanos(this, nanos);
}
else
LockSupport.park(this);
}
}
看下上面的代碼就是在獲取結(jié)果的時(shí)候,會(huì)先判斷狀態(tài)是否完成,如果完成了就正常返回結(jié)果,如果沒(méi)完成就會(huì)調(diào)用awaitDone,看名字也能看出來(lái)就是等待直到完成,進(jìn)入代碼可以看到就是將進(jìn)入死循環(huán)檢查狀態(tài),線(xiàn)程阻塞等待,直到完成。要你寫(xiě)你是不是也會(huì)這樣寫(xiě)?
5、總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java報(bào)錯(cuò)sun.misc.Unsafe.park(Native Method)問(wèn)題
這篇文章主要介紹了Java報(bào)錯(cuò)sun.misc.Unsafe.park(Native Method)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Java for循環(huán)和foreach循環(huán)的性能對(duì)比分析
這篇文章主要介紹了Java for循環(huán)和foreach循環(huán)的性能對(duì)比分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java實(shí)現(xiàn)微信掃碼登入的實(shí)例代碼
這篇文章主要介紹了java實(shí)現(xiàn)微信掃碼登入功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
idea每次新打開(kāi)的項(xiàng)目窗口maven都要重新設(shè)置問(wèn)題
這篇文章主要介紹了idea每次新打開(kāi)的項(xiàng)目窗口maven都要重新設(shè)置問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之無(wú)權(quán)無(wú)向圖
這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之無(wú)權(quán)無(wú)向圖?,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-01-01
java應(yīng)用程序如何自定義log4j配置文件的位置
這篇文章主要介紹了java應(yīng)用程序如何自定義log4j配置文件的位置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
JAVA如何自動(dòng)下載SSL證書(shū)并導(dǎo)入到本地
這篇文章主要介紹了JAVA如何自動(dòng)下載SSL證書(shū)并導(dǎo)入到本地問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07

