最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

帶你快速搞定java多線程(2)

 更新時(shí)間:2021年07月14日 14:23:30   作者:香菜聊游戲  
這篇文章主要介紹了java多線程編程實(shí)例,分享了幾則多線程的實(shí)例代碼,具有一定參考價(jià)值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下

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)子里是不是有你要的手抓餅,有的話你就拿走。當(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ě)你是不是也會(huì)這樣寫(xiě)?

5、總結(jié)

本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

最新評(píng)論

海安县| 长宁县| 喀喇沁旗| 泗阳县| 永嘉县| 皮山县| 景谷| 成武县| 五大连池市| 大厂| 黔西县| 金堂县| 宝应县| 西峡县| 双城市| 共和县| 平山县| 枝江市| 辛集市| 青浦区| 湘西| 略阳县| 平湖市| 泰顺县| 大理市| 扶余县| 巴楚县| 翼城县| 宁波市| 南安市| 南通市| 精河县| 北碚区| 澄迈县| 佳木斯市| 梓潼县| 镇雄县| 进贤县| 贞丰县| 漠河县| 安吉县|