多線程系列二》不理解future怎么能有future?

      網(wǎng)友投稿 867 2025-04-01

      《多線程系列二》不理解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 getHpTask(Integer input) {

      return bossExecutor.submit(() -> {

      System.out.println("Calculating..." + input);

      Thread.sleep(1000);

      return input * input;

      });

      }

      《多線程系列二》不理解future怎么能有future?

      public static void main(String[] args) throws ExecutionException, InterruptedException {

      Future calculate = new FutureTest().getHpTask(100);

      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)容。

      上一篇:html(一)html書寫規(guī)則、基礎(chǔ)元素、功能元素
      下一篇:excel各版本加密方法 excel無法打開沒有權(quán)限是怎么回事
      相關(guān)文章
      亚洲人成人77777在线播放| 久久亚洲精品国产精品黑人| 亚洲最新永久在线观看| 在线观看午夜亚洲一区| 最新亚洲人成无码网www电影| 亚洲精品国产国语| 亚洲国产美女精品久久| 91亚洲一区二区在线观看不卡| 亚洲AV无码乱码在线观看富二代 | 亚洲一区动漫卡通在线播放| 亚洲色欲www综合网| 亚洲色图黄色小说| 亚洲精品免费在线视频| 亚洲精品无码久久久久久久| 亚洲无圣光一区二区| 亚洲婷婷在线视频| 亚洲成a人片在线观看中文app| 亚洲精品永久www忘忧草| 亚洲午夜精品在线| 亚洲激情视频图片| 亚洲av无一区二区三区| 国产精品亚洲一区二区三区久久| 亚洲国产精品专区在线观看 | 亚洲爆乳成av人在线视菜奈实| 久久精品国产亚洲AV天海翼| 亚洲AV日韩AV无码污污网站| 无码专区一va亚洲v专区在线 | 亚洲国产精品午夜电影| 亚洲天堂2017无码中文| 亚洲国产欧洲综合997久久| 国产精品亚洲天堂| 在线观看亚洲成人| 亚洲AV无码不卡无码| 亚洲自偷精品视频自拍| 国产精品高清视亚洲精品| 亚洲熟妇AV一区二区三区浪潮| 久久久久亚洲国产AV麻豆| 亚洲女人被黑人巨大进入| 亚洲精品无码永久在线观看你懂的| 亚洲精品国产精品乱码视色| 亚洲一区综合在线播放|