《多線程系列二》不理解future怎么能有future?
《多線程系列二》不理解future怎么能有future?
目錄
《多線程系列二》不理解future怎么能有future?
1、Future的類圖結(jié)構(gòu),從整體上看下Future的結(jié)構(gòu)
2、future的使用,說的再多都么什么用,來個例子悄悄怎么用的。
3、通俗理解
4、原理
5、總結(jié)
今天說下future,F(xiàn)uture是一個interface,可以方便的用于異步結(jié)果的獲取。
項(xiàng)目需求:每個游戲都有世界BOSS的功能,因?yàn)槭澜鏱oss 是涉及所有的玩家的,為了控制多線程的復(fù)雜度,會啟動一個單線程的線程池控制整個流程,但是玩家的消息線程又需要獲得當(dāng)前世界boss 的信息,所以就有需求從單線程中獲取boss信息。怎么做吶?future就可以解決這個問題。下面一起理解future和使用future。
1、Future的類圖結(jié)構(gòu),從整體上看下Future的結(jié)構(gòu)
首先看下future接口的函數(shù),共有5個方法。
get() 獲取執(zhí)行的結(jié)果,另外一個重載是有時間限制的get ,如果超時會有異常
isDone() ?判斷future 結(jié)果是否處理完成
cancel 取消任務(wù)
2、future的使用,說的再多都么什么用,來個例子悄悄怎么用的。
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
return bossExecutor.submit(() -> {
System.out.println("Calculating..." + input);
Thread.sleep(1000);
return input * input;
});
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
Future
System.out.println(calculate.get());
System.out.println("Done");
}
}
3、通俗理解
future 就像是去買手抓餅,你把錢給老板之后,老板對你說我做好了之后會放在旁邊的盤子里,而這個盤子就是future,你用isDone ?判斷盤子里是不是有你要的手抓餅,有的話你就拿走。當(dāng)然你可以一直在那等著 get(),或者去做其他的事情,等會再來拿。
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é)果的時候,會先判斷狀態(tài)是否完成,如果完成了就正常返回結(jié)果,如果沒完成就會調(diào)用awaitDone,看名字也能看出來就是等待直到完成,進(jìn)入代碼可以看到就是將進(jìn)入死循環(huán)檢查狀態(tài),線程阻塞等待,直到完成。要你寫你是不是也會這樣寫?
5、總結(jié)
future理解起來很簡單,就是給你排個號,等下好了,我會把數(shù)據(jù)放進(jìn)去,如果你愿意等就等著,不愿等就等會來拿,就是一種延時獲取結(jié)果的方式。理解了很簡單。
下次寫什么還沒定,總之最近會一直寫多線程東西,做個總結(jié)。
《多線程系列一》線程是什么?怎么理解多線程!
學(xué)會這招,再也不用寫重復(fù)代碼了,Consumer你指的擁有!
任務(wù)調(diào)度 多線程
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。