Java 之前有個api函數(shù)可以直接關閉線程, stop(), 后來, 取消了. 其替代的方式主要有兩種:
1. 自己加入一個成員變量, 我們在程序的循環(huán)里面, 輪流的去檢查這個變量, 變量變化時,就會退出這個線程. 代碼示例如下
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) {
///
//
數(shù)據(jù)處理
///
}
//super.run();
}
public static void main(String[] args) {
StopThread thread = new StopThread();
thread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//停止線程
thread.stopThread(true);
}
}
2. 方法1 雖然可以可以處理好, 不過, 在有阻塞線程的語句的時候往往不能處理好. 比如, 設計到Socket的阻塞語句. 雖然java有提供異步io但是異步io是在程序里不斷去查詢有沒有消息的, 所以耗電量可想而知, 對手機這種設備來說往往不適用.
那么阻塞的語句,怎么終止線程呢?
Java雖然deprecate了一個stop,但是,提供了interrupt(),這個方法是安全的. 這個中斷方法可以將阻塞的線程喚醒過來, 但是注意 他不能將非阻塞的線程中斷. 中斷的同時,會拋出一個異常InterruptedException. 幸運的是, SocketChannel.connect() .read() 阻塞方法都會接受中斷,ClosedByInterruptException.
這時我們不輪詢變量了, 輪詢當前線程是否被中斷, 代碼
package com.test;
public class StopThread extends Thread {
@Override
public void run() {
try {
System.out.println("start");
while(!this.isInterrupted()) {
///
//
數(shù)據(jù)處理
///
}
} 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");
}
}
3. Android 在自己的Api中加入了,Process類, 這個類可以直接終結進程, 也就是當前線程所在的JVM.
final static void killProcess(int pid) 其中,pid, 可以通過Process.mypid() 獲取, 但這樣終結的是整個程序, 不是我們所想要的.