1. 程式人生 > >FutureTask原始碼學習

FutureTask原始碼學習

FutureTask原始碼

    FutureTask是一個可以用來監控Callable執行狀況的類
    我們首先來看一下它是如何實現監控的:

 

public void run() {
if (state != NEW ||
!UNSAFE.compareAndSwapObject(this, runnerOffset,
null, Thread.currentThread()))
return;
try {
Callable c = callable;
if (c != null && state == NEW) {
V result;
boolean ran;
try {
result = c.call();
ran = true;
} catch (Throwable ex) {
result = null;
ran = false;
setException(ex);
}
if (ran)
set(result);
}
} finally {
// runner must be non-null until state is settled to
// prevent concurrent calls to run()
runner = null;
// state must be re-read after nulling runner to prevent
// leaked interrupts
int s = state;
if (s >= INTERRUPTING)
handlePossibleCancellationInterrupt(s);
}
}


    FutureTask覆蓋了Runnable的run()方法,因此也算是一個執行緒,首先它獲取callable,然後執行callable,然後修改callable的狀態。根據callable的狀態即可監控callable的狀態。

相關推薦

ThreadPoolExecutor的submit方法以及FutureTask原始碼學習

ThreadPoolExecutor#Submit: public <T> Future<T> submit(Callable<T> task) { if (task == null) throw new NullPointerException();

FutureTask原始碼學習

FutureTask原始碼     FutureTask是一個可以用來監控Callable執行狀況的類     我們首先來看一下它是如何實現監控的: public void run() { if (sta

dubbo 叢集容錯模式原始碼學習---ForkingCluster

ForkingCluster 模式 思想:服務端多個節點並行響應(併發任務)某個服務的請求,將執行完的結果放在一個阻塞佇列中(FIFO)。第一個完成的任務的結果進入佇列,將會馬上返回,不會等待所有任務執行完成, 只要有一個任務完成,結果放到佇列中,佇列中彈出第一個(最快完成響應的那個節點

RocketMQ Consumer 負載均衡演算法原始碼學習 -- AllocateMessageQueueConsistentHash

RocketMQ 提供了一致性hash 演算法來做Consumer 和 MessageQueue的負載均衡。 原始碼中一致性hash 環的實現是很優秀的,我們一步一步分析。 一個Hash環包含多個節點, 我們用 MyNode 去封裝節點, 方法 getKey() 封裝獲取節點的

RocketMQ NameServer模組 原始碼學習

RocketMQ namesrv 模組中 用到了 MixAll 類, 其中有一個 properties2Object(Properties, Object) 通用方法,把properties 轉換成 簡單的 POJO object。 你可以進一步擴充套件:從.properties

dubbo 叢集容錯模式原始碼學習 -- FaibackCluster

#FailbackCluster 當呼叫失敗後,將呼叫失敗的請求放在failed 集合。這個集合是併發訪問,所有的請求失敗的都會放在這個結合中。之後,通過scheduledExecutorService 去定時從新執行這些失敗的請求,只要failed 集合有元素,就會執行。 public

Qt訊號槽機制原始碼學習

簡述 這裡並不全面介紹Qt的訊號槽機制的實現,僅以qt-opensource-windows-x86-msvc2015_64-5.6.0的原始碼為原料,以一個簡單的訊號槽例子為點,打通一條線。下面的原始碼大部分是經過刪減和修改的,為了使原始碼更簡單並且增加可讀性。 簡單的訊號槽例子

stl allocator原始碼學習

概述 介紹幾個allocator的原始碼實現:簡單的對operator new和operator delete進行封裝的實現,vs2015中的實現,STLport中的實現,仿造STLport實現記憶體池。 1. 參考 http://www.cplusplus.com/referenc

混合應用開發框架Cordova原始碼學習總結

有說法是,採用混合模式的WEBVIEW來開發介面,通常適用於需要經常變更的頁面,比方活動頁,或者其他展示頁面;相對行業應用來說,哪些使用原生介面開發,哪些使用WEBVIEW來開發,需要從我們當前的痛點出發來考慮,當前行業應用主要是開發週期相對長,採用WEBVIEW的方式來開發,在通用基礎

vue原始碼學習——觀察者模式

情景:接觸過vue的同學都知道,我們曾經都很好奇為什麼vue能這麼方便的進行資料處理,當一個物件的某個狀態改變之後,只要依賴這個資料顯示的部分也會發生改變,如果你依舊很好奇,那麼今天你就可以瞭解一下實現的原理 什麼是觀察者模式​​​​​​​    官方解釋是

vue原始碼學習——資料雙向繫結的Object.defineProperty

情景:vue雙向繫結,這應該是多數講vue優勢脫口而出的名詞,然後你就會接觸到一個方法 Object.defineProperty(a,"b",{}) 這個方法該怎麼用 簡單例子敲一下 var a = {} Object.defineProperty(a,"b

Vue原始碼學習(二)——生命週期

官網對生命週期給出了一個比較完成的流程圖,如下所示: 從圖中我們可以看到我們的Vue建立的過程要經過以下的鉤子函式: beforeCreate =&gt; created =&gt; beforeMount =&gt; mounted =&gt; beforeUpda

RunLoop 四: RunLoop原始碼學習

一、前言 因為RunLoop的原始碼涉及到C語言,所以比較抽象。 在蘋果網站上下載 RunLoop 的原始碼,地址為:https://opensource.apple.com/tarballs/CF/ 找到 CFRunLoop.c 檔案,進行學習。 需要找到Ru

v-model 使用場景和原始碼學習

前言 在使用v-model時習慣的想到資料雙向繫結,但是關於v-model的使用場景和原理並不熟悉。接下來說說v-model的使用場景,和vue的原始碼。 v-model的使用限制input(checkbox,radio,text),select,textarea,components HT

lua原始碼學習(一)lua的c api外圍實現

工作後,整個人已經比較鬆懈了。儘管一直在看lua的原始碼。可是一直是比較零碎的時間,沒有系統的整理,所以還是收穫不多。由於近期工作也不是非常忙了,就想整理下lua的原始碼學習的筆記。加深下印象,並分享給大家。 先說下這系列bolg我會每週更新2-3篇,沒有順序的 這些文章

Android原始碼學習

  Android原始碼 下載 2018-2-4 直接使用清華大學的映象【注意不能使用VMware + Ubuntu + 共享資料夾的方式,主要英文共享資料夾不支援linux某些檔案】 https://mirrors.tuna.tsinghua.edu.cn/help/

[紙上談兵]BigDecimal原始碼學習

一、BigDecimal宣告 新來同事看到我們程式碼中BigDeciaml用法,感覺比較奇怪,由此引出了這篇文章 使用下面方式宣告BigDecimal時,會出現精度問題 BigDecimal bd3 = new BigDecimal(0.1D); 推薦用法 BigDecimal b

Java| Java 7 原始碼學習系列--String

String表示字串,Java中所有字串的字面值都是String類的例項,例如“ABC”。字串是常量,在定義之後不能被改變,字串緩衝區支援可變的字串。因為 String 物件是不可變的,所以可以共享它們。例如: String str = "abc"; 相當於 char data[] =

WindowManagerService原始碼學習

WindowManagerService 原始碼 Android 的framework 層主要是由 WindowManagerService 與 ActivityManagerService 以及 View 所構成,這三個模組穿插互動在 framework中。 WMS 和其他很多

tensorflow原始碼學習之五 -- 同步訓練和非同步訓練

 同步和非同步訓練是由optimizer來決定的。         1. 同步訓練         同步訓練需要使用SyncReplicasOptimizer,參考https://www.tensorflow.org