1. 程式人生 > >android 終止執行緒幾種方法

android 終止執行緒幾種方法

其實android 不提倡我們終止執行緒的,以前的一些函式,stop等等都不推薦使用了,但是當我們確實要終止執行緒的時候,可看考下面的問題

有時當一個元件或者activity被destory()的時候要求其啟動的執行緒也一起終止掉,現在就來總結了一下有這有幾種方法:

  1、初始化的時候,定義啟動的執行緒為一個守護執行緒,這樣當主執行緒消亡掉的時候,其他執行緒也會被終止。

  // 使用下面的方法,當初始化一個執行緒時

       // 該語句是設定為守護執行緒,這樣在主執行緒結束的時候,相應起的守護執行緒才能正常結束。就是因為這樣的原因,我們不能在這樣的執行緒中做一些操作,比如程式對檔案的讀寫等。當用戶執行緒結束的時候,守護執行緒也同時結束,這樣就沒有進行檔案讀寫操作。

  myThread.setDaemon(true);

  myThread.start

  2、可在activity中的onstop()方法中呼叫以下程式碼。

  if (myThread != null) {

  Thread dummy = myThread;

  myThread = null;

  dummy.interrupt();

  }

  3、可線上程run()方法中設定標誌位。

  if (!paused) {

  // do something,這是執行緒run方法中

  }

  boolean paused = false;

  // 可在onPause()中通過設定標誌位使執行緒不活動,

  protected void onPause() {

  paused = true;

  super.onPause();

  }

  // 可在onPause()中通過設定標誌位啟用執行緒,

  @Override

  protected void onResume() {

  super.onResume();

  paused = false;

  }

  1.後續完善總結:

1.(通用的停止執行緒方式)定義一個變數,線上程run方法中根據變數來控制執行緒的運行於停止,該變數必須是volatile(迅變的或對該變數的訪問必須是同步的),我們之前沒有注意過這個修飾符,所以會導致一些執行緒出現沒有按預想停止的問題。

2. 根據前面的終止執行緒的通用方式,得出最終還是得讓執行緒執行完才真正退出,只是人工製造一個異常進行丟擲致使執行緒跑完,所以我猜測能夠人工的製造異常來導致執行緒完成並結束。(沒有經過實際測驗,不過理論上是可行的)例如:在非同步執行緒中執行一個網路請求操作,在等待很久之後需要停止操作,則可以在請求網路連線的動作中人工製造一個網路異常丟擲,並在run方法中捕獲,則執行緒終止。

     2.以上提出的volatile變數,解釋如下:

Java 語言中的 volatile 變數可以被看作是一種 “程度較輕的 synchronized”;與 synchronized 塊相比,volatile 變數所需的編碼較少,並且執行時開銷也較少,但是它所能實現的功能也僅是 synchronized 的一部分。

我們知道,在Java中設定變數值的操作,除了long和double型別的變數外都是原子操作,也就是說,對於變數值的簡單讀寫操作沒有必要進行同步。

這在JVM 1.2之前,Java的記憶體模型實現總是從主存讀取變數,是不需要進行特別的注意的。而隨著JVM的成熟和優化,現在在多執行緒環境下volatile關鍵字的使用變得非常重要。

在當前的Java記憶體模型下,執行緒可以把變數儲存在本地記憶體(比如機器的暫存器)中,而不是直接在主存中進行讀寫。這就可能造成一個執行緒在主存中修改了一個變數的值,而另外一個執行緒還繼續使用它在暫存器中的變數值的拷貝,造成資料的不一致。

要解決這個問題,只需要像在本程式中的這樣,把該變數宣告為volatile(不穩定的)即可,這就指示JVM,這個變數是不穩定的,每次使用它都到主存中進行讀取。一般說來,多工環境下各任務間共享的標誌都應該加volatile修飾。

Volatile修飾的成員變數在每次被執行緒訪問時,都強迫從共享記憶體中重讀該成員變數的值。而且,當成員變數發生變化時,強迫執行緒將變化值回寫到共享記憶體。這樣在任何時刻,兩個不同的執行緒總是看到某個成員變數的同一個值。

Java語言規範中指出:為了獲得最佳速度,允許執行緒儲存共享成員變數的私有拷貝,而且只當執行緒進入或者離開同步程式碼塊時才與共享成員變數的原始值對比。

這樣當多個執行緒同時與某個物件互動時,就必須要注意到要讓執行緒及時的得到共享成員變數的變化。

而volatile關鍵字就是提示VM:對於這個成員變數不能儲存它的私有拷貝,而應直接與共享成員變數互動。

使用建議:在兩個或者更多的執行緒訪問的成員變數上使用volatile。當要訪問的變數已在synchronized程式碼塊中,或者為常量時,不必使用。

由於使用遮蔽掉了VM中必要的程式碼優化,所以在效率上比較低,因此一定在必要時才使用此關鍵字。