1. 程式人生 > >android 如何結束一個執行緒?

android 如何結束一個執行緒?

  如何結束一個執行緒?

關於執行緒的結束有以下幾點:

1.不要手動呼叫stop方法強行終止一個執行緒,這種方式不安全。

通過幫助文件,我們可以知道,Android的執行緒類本身就提供一些公共方法去結束執行緒

final voidstop()

This method is deprecated. because stopping a thread in this manner is unsafe and can leave your application and the VM in an unpredictable state

但是,通過說明我們可以看到,這些方法Android

本身都是不推薦使用的,通過這種方式結束執行緒是不安全的。

2.執行緒裡run函式短,執行完後執行緒會自行銷燬,不用手動去終止。

3.手動停止,通過在run裡設定標誌先停止執行,再呼叫Thread.interrupt();注意,在run沒有停止時呼叫.interrupt()沒有效果。

1. 自己加入一個成員變數, 我們在程式的迴圈裡面, 輪流的去檢查這個變數,  變數變化時,就會退出這個執行緒. 程式碼示例如下

  1. package  com.test;
  2. public class StopThread extends  Thread {
  3.     private boolean  _run  = true;
  4.     public void stopThread( boolean  run) {
  5.          this ._run = !run;
  6.     }
  7.     @Override
  8.    public void  run() {
  9.         while(_run) {
  10.           //[img]http://www.blogjava.net/Images/dot.gif[/img]資料處理
複製程式碼 2. 方法1 雖然可以可以處理好, 不過, 在有阻塞執行緒的語句的時候往往不能處理好. 比如, 設計到Socket的阻塞語句. 雖然java有提供非同步io但是非同步io是在程式裡不斷去查詢有沒有訊息的, 所以耗電量可想而知, 對手機這種裝置來說往往不適用.


那麼阻塞的語句,怎麼終止執行緒呢?

Java雖然deprecate了一個stop,但是,提供了interrupt(),這個方法是安全的.  這個中斷方法可以將阻塞的執行緒喚醒過來, 但是注意 他不能將非阻塞的執行緒中斷. 中斷的同時,會丟擲一個異常InterruptedException. 幸運的是, SocketChannel.connect() .read() 阻塞方法都會接受中斷,ClosedByInterruptException.

這時我們不輪詢變量了, 輪詢當前執行緒是否被中斷, 程式碼
  1.             System.out.println("start");
  2.            while(!this.isInterrupted()) {
  3.                 [img]http://www.blogjava.net/Images/dot.gif[/img]資料處理
  4. }
  5.         }catch (Exception e) {
  6.             e.printStackTrace();
  7.         }
  8.         System.out.println(stop);
  9.        super.run();
  10.    }
  11.     public static void main(String[] args) {
  12.         StopThread thread=new StopThread();
  13.         thread.start();
  14.        try {
  15.             Thread.sleep(1000);
  16.         }catch (InterruptedException e) {
  17.             e.printStackTrace();
  18.         }
  19.         thread.interrupt();
  20.         System.out.println(interrupt);
  21.     }
  22. }
複製程式碼 3. Android 在自己的Api中加入了,Process類, 這個類可以直接終結程序, 也就是當前執行緒所在的JVM. 
final static void killProcess(int pid)  其中,pid, 可以通過Process.mypid() 獲取, 但這樣終結的是整個程式, 不是我們所想要的.

==================================================分割線==========================================

如果該執行緒處在不可中斷狀態下,就是沒有呼叫上述api,那麼java只是設定一下該執行緒的interrupt狀態,其他事情都不會發生,如果該執行緒之後會呼叫行數阻塞API,那到時候執行緒會馬會上跳出,並丟擲InterruptedException,接下來的事情就跟第一種狀況一致了。如果不會呼叫阻塞 API,那麼這個執行緒就會一直執行下去。除非你就是要實現這樣的執行緒,一般高效能的程式碼中肯定會有wait(),yield()之類出讓cpu的函式,不會發生後者的情況。
  1. readCacheThread = new Thread(){
  2.                 public void run() {
  3.                     try {
  4.                         Method getPackageSizeInfo = pm.getClass().getMethod(
  5.                                 "getPackageSizeInfo", String.class,
  6.                                 IPackageStatsObserver.class);
  7.                         for (AppInfoItem item : installedApp) {//個人應用
  8.                             sleep(1);//interrupt後會拋異常,這樣就可以提前結束執行緒
  9.                             getPackageSizeInfo.invoke(pm, item.packageName, pkgsizeobserver);
  10.                         }
  11.                         for (AppInfoItem item : systemApp) {//系統應用
  12.                             sleep(1);
  13.                             getPackageSizeInfo.invoke(pm, item.packageName, pkgsizeobserver);
  14.                         }
  15.                     } catch (Exception e) {
  16.                         // TODO: handle exception
  17.                         e.printStackTrace();
  18.                         Log.e("qqqqqqqqqqqqq", "sleep over");
  19.                         return;
  20.                     }
  21.                 };
  22.             };
  23.             readCacheThread.start();
複製程式碼 在需要中斷執行緒的地方呼叫:
  1. if(readCacheThread != null && readCacheThread.isAlive()){
  2.                 //Log.e("readCacheThread", "thread interrupt_1");
  3.                 readCacheThread.interrupt();
  4.                 //Log.e("status", ""+readCacheThread.isInterrupted());
  5.             }
複製程式碼 (用判斷readCacheThread.isInterrupted()方法會失敗,因為老是返回false,不知道為什麼。所以只能用sleep()然後捕獲異常再退出)。
這樣便可提前退出一個執行緒。

相關推薦

android 如何結束一個執行?

  如何結束一個執行緒? 關於執行緒的結束有以下幾點: 1.不要手動呼叫stop方法強行終止一個執行緒,這種方式不安全。 通過幫助文件,我們可以知道,Android的執行緒類本身就提供了一些公共方法去結束執行緒。 final voidstop() This

Java併發程式設計番外篇(一)如何結束一個執行

本篇部落格介紹下如何結束一個執行緒。在Java 的設計中,當一個執行緒的run方法中程式碼執行結束後,該執行緒就自動結束了。但是,在我們的實際開發過程中,可能會需要手動的結束一個執行緒,此時我們應該怎麼安全地結束一個執行緒呢? 1. stop方法 根據J

JAVA裡面如何讓一個執行死亡或結束

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

Android如何保證一個執行最多隻能有一個Looper?

如何建立Looper? Looper的構造方法為private,所以不能直接使用其構造方法建立。 private Looper(boolean quitAllowed) { mQueue = new MessageQueue(quitAllowed);

一個執行通知另外一個執行結束

有一道面試題, 有一個集合,一個執行緒t1往裡面加元素,當集合的size為5的時候,讓t2執行緒結束;三種實現方法:方法一: 使用volatilepackage thread; import java.util.ArrayList; import java.util.Lis

Win32執行——等待另一個執行結束

轉載: https://blog.csdn.net/yss28/article/details/53646627 《Win32多執行緒程式設計》–Jim Beveridge & Robert Wiener “等待某個什麼東西”是執行緒常常需要做的事。等待是執行緒

android檢測某一個執行是否開啟

上程式碼先 /** * 判斷服務是否執行 * * @param context * @param clazz * @return

Win32多執行之等待一個執行結束(WaitForSingleObject)

  由於執行緒停工是作業系統的責任,當然作業系統也有責任讓其他執行緒知道某個執行緒停工了。    Win32提供了一個名為WaitForSingleObject()的函式。他的第一個引數是個核心物件(如執行緒)的handle,為了方便討論,我把即將等待的執行緒稱為執行緒#1

iOS 中使用GCD怎麼讓兩個執行執行結束後再去執行一個執行

//利用GCD並行多個執行緒並且等待所有執行緒結束之後再執行其它任務 dispatch_group_t group = dispatch_group_create(); dispatch_group_

Android AsyncTask實現一個執行操作完成後啟動另一個執行

如何在一個執行緒完成操作後執行另一個執行緒? 有時候我們需要等待一個執行緒執行完成後再執行下一個執行緒。 發現asynctask可以實現這個功能,可以在一個執行緒操作完成後執行下一個執行緒。 原理就不多說了,直接看程式碼:  實現下載三個網路圖片,第一幅圖片下載完成後接

百度Android面試題之如何停止一個執行

前段時間去面試了百度android職位,雖然沒有通過,但是發現了很多自己的不足,回來痛定思痛,決定將所有的面試題整理到CSDN上,查漏補缺。問:如何停止一個執行緒?由於平時不怎麼寫多執行緒,所以直接說了個interrupt()顯然是不對的。那麼接下來我們探討一下java中如何

網路程式設計基礎【day10】:我是一個執行(四)

本節內容 1、第一回 初生牛犢 2、第二回 漸入佳境 3、第三回 虎口脫險 4、第四回 江湖再見 第一回 初生牛犢 我是一個執行緒,我一出生就被編了個號:0x3704,然後被領到一個昏暗的屋子裡,在這裡我發現了很多和我一模一樣的同伴。 我身邊的同伴0x6900 待的時間比較長,他帶著滄桑的口氣對

如何實現一個執行排程框架

一、前言 執行緒是程式執行流的最小單元,很基礎,也很重要。為了提高流暢性,耗時任務放後臺執行緒執行,這是APP開發的常識了。隨著APP複雜度的提升,越來越多工需要開執行緒執行,同時,遇到如下挑戰: 任務場景多樣化,常規的API無法滿足; 隨著元件化,模組化等演進,可能使得執行緒管理不統一(比如多

Thread和Runnable的區別和聯絡、多次start一個執行會怎麼樣

一、Java有兩種方式實現多執行緒,第一個是繼承Thread類,第二個是實現Runnable介面。他們之間的聯絡:     1、Thread類實現了Runable介面。   2、都需要重寫裡面Run方法。 二、實現Runnable介面相對於繼承Thread類來說,有如下顯著的好處:

一個執行控制另一個執行的暫停或啟動

MainTest類中可以控制執行緒的暫停或繼續執行。 public class MainTest { /** * 這個執行緒操作另一個執行緒的暫停或開始 * @param args */ public static void main(String[] args) {

實現一個執行

1.定義執行緒池  //業務執行緒池 private static final ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()

Android ActivityThread 主執行或UI執行 簡介

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

Android中的執行執行

執行緒與執行緒池 概括 執行緒分為主執行緒和子執行緒. 主執行緒主要是用來處理和介面相關的事情, 子執行緒主要是用來做耗時的操作,比如 載入遠端資料,資料庫操作等。 在android 中,處理直接使用 Thread以外。 android 還提供了很多類似執行緒的操作便於我們

C++設計一個執行安全的懶漢單例模式

#incldue<iostream> #include<mutex> using namespace std; class CSingleton { public: static CSingleton* GetCSingleton() { if (_p ==

寫兩個執行一個執行列印 1~52,另一個執行列印A~Z, 列印順序是12A34B...5152Z

這個題目就是要用wait()和notify()方法來控制兩個執行緒的執行 看如下程式碼: 當標誌位flag為1 時,列印數字;否則列印字母 count即為列印的數字 class Print { private int flag = 1;