android 多線程future,多線程FutureTask的使用方法和使用實例

FutureTask是一種可以取消的異步的計算任務。它的計算是通過Callable實現的,它等價于可以攜帶結果的Runnable,并且有三個狀態:等待、運行和完成。完成包括所有計算以任意的方式結束,包括正常結束、取消和異常。

Future有個get方法而獲取結果只有在計算完成時獲取,否則會一直阻塞直到任務轉入完成狀態,然后會返回結果或者拋出異常。

FutureTask有下面幾個重要的方法:

1.get()

阻塞一直等待執行完成拿到結果

2.get(int timeout, TimeUnit timeUnit)

阻塞一直等待執行完成拿到結果,如果在超時時間內,沒有拿到拋出異常

3.isCancelled()

是否被取消

4.isDone()

是否已經完成

5.cancel(boolean mayInterruptIfRunning)

試圖取消正在執行的任務

用ThreadPoolExecutor和FutureTask實現可取消任務線程池

private?Map> tasks =?new?HashMap>();

// 構造一個線程

private?ThreadPoolExecutor executor =?new?ThreadPoolExecutor(1,?1, 0L, TimeUnit.MILLISECONDS,?newLinkedBlockingQueue());

/**

* @param tasksList

*/

public?void?addTaskList(List> tasksList) {

for?(Callable t : tasksList) {

FutureTask futureTask =?new?FutureTask(t);

executor.execute(futureTask);

String key = Long.toHexString(System.nanoTime());

tasks.put(key, futureTask);

}

}

/**

* @param task

* @return

*/

public?String addTask(Callable task) {

FutureTask futureTask =?new?FutureTask(task);

executor.execute(futureTask);

String key = Long.toHexString(System.nanoTime());

tasks.put(key, futureTask);

return?key;

}

/**

* @param task

* @return

*/

public?String addDBTask(Callable task) {

FutureTask futureTask =?new?FutureTask(task) {

public?boolean?cancel(boolean?mayInterruptIfRunning) {

System.out.println("Roll Back and Closs Session");

return?super.cancel(mayInterruptIfRunning);

}

};

executor.execute(futureTask);

String key = Long.toHexString(System.nanoTime());

tasks.put(key, futureTask);

return?key;

}

/**

* @param key

* @return

*/

public?boolean?taskIsDone(String key) {

FutureTask futureTask = tasks.get(key);

if?(futureTask !=?null) {

return?futureTask.isDone();

}

return?false;

}

/**

* @param key

* @return

*/

public?boolean?taskIsCancelled(String key) {

FutureTask futureTask = tasks.get(key);

if?(futureTask !=?null) {

return?futureTask.isCancelled();

}

return?false;

}

/**

* @param key

* @return

*/

public?String getTaskResult(String key) {

FutureTask futureTask = tasks.get(key);

if?(futureTask.isDone()) {

try?{

String result = futureTask.get();

tasks.remove(key);

return?result;

}?catch?(InterruptedException e) {

e.printStackTrace();

return?null;

}?catch?(ExecutionException e) {

e.printStackTrace();

return?null;

}

}?else?{

return?null;

}

}

/**

* @param task

* @return

*/

public?String addTaskAndWaitResult(Callable task) {

FutureTask futureTask =?new?FutureTask(task);

executor.execute(futureTask);

String key = Long.toHexString(System.nanoTime());

tasks.put(key, futureTask);

try?{

return?futureTask.get();

}?catch?(InterruptedException e) {

e.printStackTrace();

return?null;

}?catch?(ExecutionException e) {

e.printStackTrace();

return?null;

}

}

/**

*

*/

public?void?removeAllTask() {

for?(String key : tasks.keySet()) {

executor.remove((Runnable) tasks.get(key));

tasks.remove(key);

}

}

/**

* @param key

*/

public?void?removeQueryTask(String key) {

executor.remove((Runnable) tasks.get(key));

}

/**

* @param key

*/

public?void?removeTask(String key) {

tasks.remove(key);

}

/**

*

*/

public?void?clearTaskList() {

tasks.clear();

}

public?synchronized?void?stop(){

try?{

executor.shutdownNow();

executor.awaitTermination(1L, TimeUnit.MILLISECONDS);

}?catch?(InterruptedException e) {

e.printStackTrace();

}?finally?{

executor =?null;

tasks.clear();

tasks =?null;

}

}

/**

* @param key

*/

public?void?cancelTask(String key) {

FutureTask futureTask = tasks.get(key);

if?(futureTask !=?null) {

if?(!futureTask.isDone()) {

futureTask.cancel(true);

}

}

}

public?void?purgeCancelTask() {

executor.purge();

executor.getQueue();

}

/**

* @param args

*/

public?static?void?main(String[] args) {

ImageSearchThreadPool exec =?new?ImageSearchThreadPool();

ArrayList keyList =?new?ArrayList();

ArrayList removeKeyList =?new?ArrayList();

ArrayList cancelKeyList =?new?ArrayList();

for?(int?i =?0; i

// 產生一個任務,并將其加入到線程池

String task =?"task@ "?+ (i +?1);

System.out.println("put "?+ task);

keyList.add(exec.addDBTask(new?DBTask(task)));

}

try?{

Thread.sleep(1L);

}?catch?(InterruptedException e) {

e.printStackTrace();

}

for?(int?i =?0; i

if?(exec.taskIsDone(keyList.get(i))) {

System.out.println(exec.getTaskResult(keyList.get(i)));

exec.removeTask(keyList.get(i));

removeKeyList.add(keyList.get(i));

}?else?{

exec.cancelTask(keyList.get(i));

System.out.println("Cancel task: "?+ (i +?1));

exec.removeTask(keyList.get(i));

cancelKeyList.add(keyList.get(i));

}

}

exec.purgeCancelTask();

exec.stop();

try?{

Thread.sleep(6000L);

}?catch?(InterruptedException e) {

e.printStackTrace();

}

for?(String key : cancelKeyList) {

if?(exec.taskIsCancelled(key)) {

System.out.println("Cancel: "?+ key);

}

}

for?(int?i =?0; i

keyList.get(i);

}

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453274.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453274.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453274.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2017.12.26

轉載于:https://www.cnblogs.com/dyh-air/p/8118961.html

mac 下安裝pip

pip是常用的python包管理工具,類似于java的maven。用python的同學,都離不開pip。 在新mac中想用home-brew安裝pip時,遇到了一些小問題: bogon:~ wanglei$ brew install pip Error: No available formula with the name "pip&…

IT職場人生系列

IT職場人生系列之一:序言及找誰占卜 本文是IT職場人生系列的第一篇。 時間流逝,漸漸從之前在公司里邊的小弟變成大哥了,當年身邊比我大的程序員們都不見了,既沒有當領導也沒有去創業,就這么消失了。 年輕的程序員或…

RS-232協議

計算機與計算機或計算機與終端之間的數據傳送可以采用串行通訊和并行通訊二種方式。由于串行通訊方式具有使用線路少、成本低,特別是在遠程傳輸時,避免了多條線路特性的不一致而被廣泛采用。 在串行通訊時,要求通訊雙方都采用一個標準接口&am…

linux sed 找出前后三行,Linux Sed 使用示例

環境:CentOS鑒于語句描述蒼白無力,用例子直接說明。mytxt文件內容:zilzhang 19881110 jiangxi 18 filmzhagnsan 21321 sichuan 100 cardlisi 3435 hunan 65 TV1. 找出文件第二行$ sed -n ‘2p‘ mytxtzhagnsan 21321 sichua…

MessageBox 彈框

模擬系統的消息提示框而實現的一套模態對話框組件,用于消息提示、確認消息和提交內容。 從場景上說,MessageBox 的作用是美化系統自帶的 alert、confirm 和 prompt,因此適合展示較為簡單的內容。如果需要彈出較為復雜的內容,請使用…

什么是同軸電纜

同軸電纜從用途上分可分為基帶同軸電纜和寬帶同軸電纜(即網絡同軸電纜和視頻同軸電纜)。同軸電纜分50Ω 基帶電纜和75Ω寬帶電纜兩類。基帶電纜又分細同軸電纜和粗同軸電纜。基帶電纜僅僅用于數字傳輸,數據率可達10Mbps。同軸電纜(Coaxial Ca…

android textview表情,Android開發(16)-TextView顯示表情圖像和文字

從這個案例中我們可以學到當我們美化圖片美化界面的時候可以在某一區域輸入圖片和文字混搭信息,第三張圖片按比例縮小,第四張圖像有超鏈接布局文件MainActivity.javapackage com.example.textview3;import java.lang.reflect.Field;import android.os.Bundle;import…

Rating

題目鏈接 題意: 起始狀態是(0。0),每次轉移的時候都是對兩個數中的較小的數操作。1)以概率p轉向(min(a 50,1000)。b) 2)以概率1-p轉向&#x…

linux的apache2.4限定某個目錄禁止解析PHP及user_agent與PHP相關配置

限定某個目錄禁止解析PHP 對于使用PHP語言編寫的網站,有一些目錄是有需求上傳文件的,比如服務器可以上傳圖片,并且沒有做防盜鏈,所以就會被人家當成了一個圖片存儲服務器,并且盜用帶寬流量。如果網站代碼有漏洞&#x…

什么是光纜

光纜(optical fiber cable)是為了滿足光學、機械或環境的性能規范而制造的,它是利用置于包復護套中的一根或多根光纖作為傳輸媒質并可以單獨或成組使用的通信線纜組件。光纜主要是由光導纖維(細如頭發的玻璃絲)和塑料保護套管及塑料外皮構成&…

js調用android播放器,js調用android本地方法

8種機械鍵盤軸體對比本人程序員,要買一個寫代碼的鍵盤,請問紅軸和茶軸怎么選?昨天自己錄了一個android本地調用h5中js方法,可能是因為視頻比較耗費流量,結果看的人不是很多,所以決定還是先寫文章&#xff0…

linux之分區的水深(標準分區方式)

1.首先創建boot分區(200M即可) boot分區作為linux啟動相關信息的存儲介質,不論boot分區什么時候,它都會排在整個硬盤的起始段,方便系統啟動獲取相關信息,用戶盡量不去更改boot分區的掛載點順序。 2.接著創建swap分區(應…

doxygen相關問題

doxygen相關問題 我主要的設置有 現在 wizard對話框中大體設置下,然后 export設置: project->DOXYFILE_ENCODINGGBK project->OUTPUT_LANGUAGEchinese input->INPUT_ENCODINGGBK Dot->HAVE_DOT Dot-> UML_LOOK Dot->CALL_GRAPH Dot->CALLER_GRAPH http…

前端之JavaScript 02

一、函數 // 最基礎的函數定義 function f1() {console.log(hello world!); } f1(); // hello world!// 帶參數的函數 function f2(name,age) {console.log("姓名 : " name " 年齡:" age); } f2("jassin",18); // 姓名 : jassi…

什么是雙絞線

雙絞線(twisted pair,TP)是一種綜合布線工程中最常用的傳輸介質,是由兩根具有絕緣保護層的銅導線組成的。把兩根絕緣的銅導線按一定密度互相絞在一起,每一根導線在傳輸中輻射出來的電波會被另一根線上發出的電波抵消&a…

Android蒙版倒計時,【倒計時海報設計】- 虎課網

我們在大街上經常會看到各種宣傳海報,有時商家為了達到促銷的目的會在醒目的地方張貼一張倒計時海報,為的就是吸引群眾的眼睛,大家了解PS倒計時海報設計的制作過程嗎?如果對這方面操作不太了解的話,大家可以關注一下下…

linkit-smart-7688-feed 安裝筆錄

轉載于:https://www.cnblogs.com/orangezs/p/8571791.html

前端性能優化之性能測試

前端性能優化是一個很寬泛的概念,有很多教程都有前端性能優化的方法,這也是我們一直在關注的一件重要事情。配合各種方式、手段、輔助系統,前端優化的最終目的都是提升用戶體驗,改善頁面性能,我們常常竭盡全力進行前端…

模擬傳輸和數字傳輸的優缺點

與模擬數據通信相比較,數字數據通信具有下列優點: a. 來自聲音、視頻和其他數據源的各類數據均可統一為數字信號的形式,并通過數字通信系統傳輸 b. 以數據幀為單位傳輸數據,并通過檢錯編碼和重發數據幀來發現與糾正通信錯誤&am…