1. 程式人生 > >furtureTask 避免主執行緒長時間阻塞

furtureTask 避免主執行緒長時間阻塞

 某些情況下,你的需求列表中的某一個子任務所花費的時間可能是你不能控制,不能預知的(譬如url獲取請求資料)。有的時候它很快,有的時侯得到結構需要花費你預料以外的很長時間,最終阻塞了你的主執行緒,使得你的主執行緒快慢依賴於這個看起來並不那麼重要的功能。也許你需要給這個子任務限定一個時間段,在這個時間段內得不到資料後你的主執行緒轉身離開,不過遺憾的是這個子任務的處理的api沒有提供某一時間得不到結構就向你報告的行為。

      如果你碰到這種情況,FurtureTask可以作為一個備選的解決方案:

      FurtureTask是一個java.lang.Runnable介面的實現子類和java.util.concurrent.Future介面的實現子類。所以它可以作為Thread的傳入引數後被start(),同時Future介面行為提供get(long timeout, TimeUnit unit)的API,當在指定的時間內得不到結果後就丟擲定製的TimeoutException異常。關於FurtureTask更詳細的行為請參考javadoc和周欽的多執行緒案例,下面給出使用的案例,本案例側重get(timeout, unit)的使用(TimeUnit 一個enum類):

/**
 * 為url訪問並獲取返回字串獨立開啟一個執行緒
 * 為了達到可控時間內獲取返回值(如果超過一定時間沒有返回結果,將不再等待返回結果,避免主執行緒過長時間阻塞)
 * 結合FutureTask使用
 * @author Administrator
 *
 */

     public class UrlCallor implements Callable {

 public UrlCallor(String url ){
  this.url = url;
 }

 private String url ;

 public String getUrl() {
  return url;
 }

 public void setUrl(String url) {
  this.url = url;
 }

 @Override
 public Object call() throws Exception {
  String _ating_data ;
  // System.out.println(url);
  Parser parser = new Parser(url);
  parser.setEncoding("utf-8");
  NodeIterator ni = parser.elements();
  if(ni!=null){
    _ating_data = ni.nextNode().toPlainTextString().trim();
     //System.out.println(ni.nextNode().toPlainTextString());
  }else{
   _ating_data = "";
  }
  return _ating_data;
 
 }

}

public class AiTingUtil {
 private static Logger log = Logger.getLogger(AiTingUtil.class);

 public static String getAtingDts(String name){
  String _ating_data ="{}";
  String url = null; 
  try {
   url = "****";

  } catch (UnsupportedEncodingException e) {
   log.error("aiting url error:"+e);
   return "";
  }
  // System.out.println(url);
  log.info(" );
 
  UrlCallor urlcallor = new UrlCallor(url);
  FutureTask<String> _ft = new FutureTask<String>(urlcallor);
  Thread _urlthread = new Thread(_ft);
  _urlthread.start();
  try {
   _ating_data = _ft.get(200, TimeUnit.MILLISECONDS);
  }catch(Exception ex){
   log.error("等待資料200毫秒以上,異常資訊:"+ex);
   _ating_data ="";
  }
 
  return _ating_data;
 }

 public static void main(String[] args){
  System.out.println(new AiTingUtil().getAtingDts("郭德綱"));
 }
}

相關推薦

furtureTask 避免執行時間阻塞

 某些情況下,你的需求列表中的某一個子任務所花費的時間可能是你不能控制,不能預知的(譬如url獲取請求資料)。有的時候它很快,有的時侯得到結構需要花費你預料以外的很長時間,最終阻塞了你的主執行緒,使得你的主執行緒快慢依賴於這個看起來並不那麼重要的功能。也許你需要給這個子任務

【FAQ系列】複製執行時間Opening tables

前言:在slave上,發現SQL thread長時間處於Opening tables狀態 1、問題描述 朋友的資料庫,做了主從replication複製。在slave例項上,SQL thread的長時間處於Opening tables狀態,複製程序異常。 整個例項大概20個database,總共3

FAQ系列 | 複製執行時間Opening tables

0、導讀 在slave上,發現SQL thread長時間處於Opening tables狀態 1、問題描述 朋友的資料庫,做了主從replication複製。在slave例項上,SQL thread的長時間處於Opening ta

Java-時間等待(執行睡眠)

  Java-時間等待 1 TimeUnit.DAYS.sleep(1);//天 2 TimeUnit.HOURS.sleep(1);//小時 3 TimeUnit.MINUTES.sleep(1);//分 4 TimeUnit.SECONDS.sleep(1);//秒

Android中為什麼執行不會因為Looper.loop()方法造成阻塞

很多人都對Handler的機制有所瞭解,如果不是很熟悉的可以看看我 如果看過原始碼的人都知道,在處理訊息的時候使用了Looper.loop()方法,並且在該方法中進入了一個死迴圈,同時Looper.loop()方法是在主執行緒中呼叫的,那麼為什麼沒有造成阻

關於執行中自動建立的Looper的思考:執行中Looper中的輪詢死迴圈為何沒有阻塞執行

Android中UI執行緒會自動給我們建立一個looper,但是looper中的loop方法是個死迴圈.為什麼我們在UI執行緒中寫的程式碼為何都能順利執行?為什麼沒有引起ANR呢? Looper的部分原始碼: /** * Initial

Android UI 執行Loop.loop()死迴圈為啥沒有阻塞執行

要完全徹底理解這個問題,需要準備以下4方面的知識:Process/Thread,Android Binder IPC,Handler/Looper/MessageQueue訊息機制,Linux pipe/epoll機制。總結一下樓主主要有3個疑惑:1.Android中為什麼主執行緒不會因為Looper.loo

Android TCP通訊的簡單例項以及常見問題[超時/執行阻塞]

個人更喜歡著眼於例項,從最簡單的開始,一步步進行測試。 理論什麼的先放一邊,把程式跑起來再說。只有跑起來了,才會有動力去繼續往下學,參透整個程式碼的執行機制。 本次的例項目標是—— 模擬一個PC伺服器與android端的通訊,目標是儘量的做到精簡,使程式碼僅留下所需核心部

1、connect方法會阻塞,請問有什麼方法可以避免長時間阻塞? 答:最通常的方法最有效的是加定時器;也可以採用非阻塞模式。 2、網路中,如果客戶端突然掉線或者重啟,伺服器端怎麼樣才能立刻知道? 答

3.在子網 />答: 簡: 30表示的是網路號(network number)是30位,剩下2位中11是廣播(broadcast)地址,00是multicast地址,只有01和10可以作為host address。 詳: />代表的子網的網路號是30位,即網路號是 & =,此子網的地址空間

Android中在執行呼叫Thread.sleep()會導致Handler.postDelayed()在sleep的這段時間無法執行

場景是一個公司之前的老專案裡面有人使用了Handler.postDelayed(mRunnable,1000)做一個重複計時並且累加的功能,需求是每一秒都要跑一次這個Runnable,同時是有視訊在播放的,Runnable裡面是比較視訊播放的進度和我跑了多少秒來比對,再確定要

C++初學者筆記:std::thread,子執行阻塞執行的問題

C++ 11 支援跨平臺執行緒啦,當然要嚐嚐鮮 之前用的各平臺執行緒實現方式都不一樣,換個平臺或者換個庫,使用方法就不一樣了 編輯了個小例子,本來以為很容易,誰知道也要撞撞牆。 #include <stdio.h> #include <stdlib.h&g

執行、守護執行、非守護執行

主執行緒 main,但不是守護執行緒。 守護執行緒 是指在程式執行的時候在後臺提供一種通用服務的執行緒。如gc。 非守護執行緒 也叫使用者執行緒,由使用者建立。 關係: 主執行緒和守護執行緒一起銷燬; 主執行緒和非守護執行緒互不影響。 例如: package

安卓判斷當前是否在執行

判斷當前是否在主執行緒:ThreadExecutor.isMainThread() 如果當前不是主執行緒,切換到主執行緒: ThreadExecutor.getInstance().executeOnUI(new Runnable() {       &nb

java多執行11.非阻塞同步機制

關於非阻塞演算法CAS。 比較並交換CAS:CAS包含了3個運算元---需要讀寫的記憶體位置V,進行比較的值A和擬寫入的新值B。當且僅當V的值等於A時,CAS才會通過原子的方式用新值B來更新V的值,否則不會執行任何操作。無論位置V的值是否等於A,都將返回V原有的值。然後執行緒可以基於新返回的V值來做對應的操作

Android面試:執行中的Looper.loop()一直無限迴圈為什麼不會造成ANR?(轉)

  引子: 正如我們所知,在android中如果主執行緒中進行耗時操作會引發ANR(Application Not Responding)異常。 造成ANR的原因一般有兩種: 只有當應用程式的UI執行緒響應超時才會引起ANR,超時產生原因一般有兩種 1. 當前的事件沒有機會

Android執行向子執行中傳送資訊

主要用到了Handler類,Looper類和Message類 先介紹下這幾個類 Looper類,是用來為一個執行緒開啟一個訊息佇列,預設情況下Android下新開啟的執行緒沒有開啟訊息佇列的,除了主執行緒外,主執行緒系統會預設為其開啟一個訊息佇列;looper是通過MessageQueu

Android ActivityThread 執行或UI執行 簡介

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

遊戲Call技術-繫結執行呼叫CALL技術(反遊戲檢測call)

我們在寫call呼叫遊戲程序裡call時候,經常外掛執行工作一段時間後,遊戲就會斷線或崩潰掉,但是經過檢查, 發現自己呼叫CALL的程式碼又沒發現寫錯誤,這到底是怎麼呢?{:100_162:} 其實這些是現在遊戲的一些遊戲反外掛檢測導致的,並不是我們呼叫call的程式碼沒寫對, 現在的

android執行中Looper.loop()為什麼不會造成程式ANR

程式入口為ActivityThread的main方法,原始碼如下: frameworks/base/core/java/android/app/ActivityThread.java public static void main(String[] args) { S

【小家java】Java中執行(父執行)與子執行的通訊和聯絡

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9