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. 自己加入一個成員變數, 我們在程式的迴圈裡面, 輪流的去檢查這個變數, 變數變化時,就會退出這個執行緒. 程式碼示例如下
-
package com.test;
-
public class StopThread extends Thread {
-
private boolean _run = true;
-
public void stopThread( boolean run) {
-
this ._run = !run;
-
}
-
@Override
-
public void run() {
-
while(_run) {
-
//[img]http://www.blogjava.net/Images/dot.gif[/img]資料處理
那麼阻塞的語句,怎麼終止執行緒呢?
Java雖然deprecate了一個stop,但是,提供了interrupt(),這個方法是安全的. 這個中斷方法可以將阻塞的執行緒喚醒過來, 但是注意 他不能將非阻塞的執行緒中斷. 中斷的同時,會丟擲一個異常InterruptedException. 幸運的是, SocketChannel.connect() .read() 阻塞方法都會接受中斷,ClosedByInterruptException.
這時我們不輪詢變量了, 輪詢當前執行緒是否被中斷, 程式碼
-
System.out.println("start");
-
while(!this.isInterrupted()) {
-
[img]http://www.blogjava.net/Images/dot.gif[/img]資料處理
-
}
-
}catch (Exception e) {
-
e.printStackTrace();
-
}
-
System.out.println(stop);
-
super.run();
-
}
-
public static void main(String[] args) {
-
StopThread thread=new StopThread();
-
thread.start();
-
try {
-
Thread.sleep(1000);
-
}catch (InterruptedException e) {
-
e.printStackTrace();
-
}
-
thread.interrupt();
-
System.out.println(interrupt);
-
}
-
}
final static void killProcess(int pid) 其中,pid, 可以通過Process.mypid() 獲取, 但這樣終結的是整個程式, 不是我們所想要的.
==================================================分割線==========================================
如果該執行緒處在不可中斷狀態下,就是沒有呼叫上述api,那麼java只是設定一下該執行緒的interrupt狀態,其他事情都不會發生,如果該執行緒之後會呼叫行數阻塞API,那到時候執行緒會馬會上跳出,並丟擲InterruptedException,接下來的事情就跟第一種狀況一致了。如果不會呼叫阻塞 API,那麼這個執行緒就會一直執行下去。除非你就是要實現這樣的執行緒,一般高效能的程式碼中肯定會有wait(),yield()之類出讓cpu的函式,不會發生後者的情況。
-
readCacheThread = new Thread(){
-
public void run() {
-
try {
-
Method getPackageSizeInfo = pm.getClass().getMethod(
-
"getPackageSizeInfo", String.class,
-
IPackageStatsObserver.class);
-
for (AppInfoItem item : installedApp) {//個人應用
-
sleep(1);//interrupt後會拋異常,這樣就可以提前結束執行緒
-
getPackageSizeInfo.invoke(pm, item.packageName, pkgsizeobserver);
-
}
-
for (AppInfoItem item : systemApp) {//系統應用
-
sleep(1);
-
getPackageSizeInfo.invoke(pm, item.packageName, pkgsizeobserver);
-
}
-
} catch (Exception e) {
-
// TODO: handle exception
-
e.printStackTrace();
-
Log.e("qqqqqqqqqqqqq", "sleep over");
-
return;
-
}
-
};
-
};
-
readCacheThread.start();
-
if(readCacheThread != null && readCacheThread.isAlive()){
-
//Log.e("readCacheThread", "thread interrupt_1");
-
readCacheThread.interrupt();
-
//Log.e("status", ""+readCacheThread.isInterrupted());
-
}
這樣便可提前退出一個執行緒。
相關推薦
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;