android 如何终止线程
今天,簡單講講如何終止線程。
Android終止線程的方法
?
線程對象屬于一次性消耗品,一般線程執(zhí)行完run方法之后,線程就正常結(jié)束了,線程結(jié)束之后就報廢了,不能再次start,只能新建一個線程對象。但有時run方法是永遠(yuǎn)不會結(jié)束的。例如在程序中使用線程進(jìn)行Socket監(jiān)聽請求,或是其他的需要循環(huán)處理的任務(wù)。在這種情況下,一般是將這些任務(wù)放在一個循環(huán)中,如while循環(huán)。當(dāng)需要結(jié)束線程時,如何退出線程呢?
?? ?1.? 使用退出標(biāo)志,使線程正常退出,也就是當(dāng)run方法完成后線程終止。
??? 2.? 使用stop方法強(qiáng)行終止線程(這個方法不推薦使用,因為stop和suspend、resume一樣,也可能發(fā)生不可預(yù)料的結(jié)果)。
??? 3.? 使用interrupt方法中斷線程。
1. 使用退出標(biāo)志終止線程
??? 當(dāng)run方法執(zhí)行完后,線程就會退出。但有時run方法是永遠(yuǎn)不會結(jié)束的。如在服務(wù)端程序中使用線程進(jìn)行監(jiān)聽客戶端請求,或是其他的需要循環(huán)處理的任務(wù)。在這種情況下,一般是將這些任務(wù)放在一個循環(huán)中,如while循環(huán)。如果想讓循環(huán)永遠(yuǎn)運(yùn)行下去,可以使用while(true){……}來處理。但要想使while循環(huán)在某一特定條件下退出,最直接的方法就是設(shè)一個boolean類型的標(biāo)志,并通過設(shè)置這個標(biāo)志為true或false來控制while循環(huán)是否退出。下面給出了一個利用退出標(biāo)志終止線程的例子。
package chapter2;public class ThreadFlag extends Thread {public volatile boolean exit = false;public void run(){while (!exit);}public static void main(String[] args) throws Exception{ThreadFlag thread = new ThreadFlag();thread.start();sleep(5000); // 主線程延遲5秒thread.exit = true; // 終止線程threadthread.join();System.out.println("線程退出!");} }
在上面代碼中定義了一個退出標(biāo)志exit,當(dāng)exit為true時,while循環(huán)退出,exit的默認(rèn)值為false.在定義exit時,使用了一個Java關(guān)鍵字volatile,這個關(guān)鍵字的目的是使exit同步,也就是說在同一時刻只能由一個線程來修改exit的值,
? 2. 使用stop方法終止線程
??? 使用stop方法可以強(qiáng)行終止正在運(yùn)行或掛起的線程。我們可以使用如下的代碼來終止線程:
thread.stop();
最好不要手動調(diào)用stop方法強(qiáng)行終止一個線程,這種方式不安全。
通過幫助文檔,我們可以知道,Android的線程類本身就提供了一些公共方法去結(jié)束線程。
final void??stop()
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本身都是不推薦使用的,通過這種方式結(jié)束線程是不安全的。
程序中可以直接使用thread.stop()來強(qiáng)行終止線程,但是stop方法是很危險的,就象突然關(guān)閉計算機(jī)電源,而不是按正常程序關(guān)機(jī)一樣,可能會產(chǎn)生不可預(yù)料的結(jié)果,不安全主要是:thread.stop()調(diào)用之后,創(chuàng)建子線程的線程就會拋出ThreadDeatherror的錯誤,并且會釋放子線程所持有的所有鎖。一般任何進(jìn)行加鎖的代碼塊,都是為了保護(hù)數(shù)據(jù)的一致性,如果在調(diào)用thread.stop()后導(dǎo)致了該線程所持有的所有鎖的突然釋放(不可控制),那么被保護(hù)數(shù)據(jù)就有可能呈現(xiàn)不一致性,其他線程在使用這些被破壞的數(shù)據(jù)時,有可能導(dǎo)致一些很奇怪的應(yīng)用程序錯誤。因此,并不推薦使用stop方法來終止線程。
? 3. 使用interrupt方法終止線程
??? 使用interrupt方法來終端線程可分為兩種情況:
??? (1)線程處于阻塞狀態(tài),如使用了sleep方法。
??? (2)使用while(!isInterrupted()){……}來判斷線程是否被中斷。
??? 在第一種情況下使用interrupt方法,sleep方法將拋出一個InterruptedException例外,而在第二種情況下線程將直接退出。下面的代碼演示了在第一種情況下使用interrupt方法。
package chapter2;public class ThreadInterrupt extends Thread {public void run(){try{sleep(50000); // 延遲50秒}catch (InterruptedException e){System.out.println(e.getMessage());}}public static void main(String[] args) throws Exception{Thread thread = new ThreadInterrupt();thread.start();System.out.println("在50秒之內(nèi)按任意鍵中斷線程!");System.in.read();thread.interrupt();thread.join();System.out.println("線程已經(jīng)退出!");} }
上面代碼的運(yùn)行結(jié)果如下:
在50秒之內(nèi)按任意鍵中斷線程!sleep interrupted線程已經(jīng)退出!
在調(diào)用interrupt方法后, sleep方法拋出異常,然后輸出錯誤信息:sleep interrupted.
??? 注意:在Thread類中有兩個方法可以判斷線程是否通過interrupt方法被終止。一個是靜態(tài)的方法interrupted(),一個是非靜態(tài)的方法isInterrupted(),這兩個方法的區(qū)別是interrupted用來判斷當(dāng)前線是否被中斷,而isInterrupted可以用來判斷其他線程是否被中斷。因此,while (!isInterrupted())也可以換成while (!Thread.interrupted())。
android 如何終止線程就講完了。
就這么簡單。
總結(jié)
以上是生活随笔為你收集整理的android 如何终止线程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android studio 设置控制台
- 下一篇: android fitsSystemWi