創(chuàng)建線程的兩種方法:
- 繼承Thread, 并實現(xiàn)run方法;
- 實現(xiàn)Runnable;
不管是使用哪一種方法創(chuàng)建線程,run方法的任務(wù)執(zhí)行完了,線程就自動停止.
stop():不建議使用
public class ThreadStop extends Thread {
@Override
public void run() {
super.run();
for (int i=0;i<100000;i++){
Log.e("ThreadStop","run: "+i);
}
}
}
thread = new ThreadStop();
thread.start();
thread.stop();
雖然stop()可以停止一個線程种玛,但是這個方法是不安全的,因為如果線程中操作的是一些復(fù)雜一點的對象,例如bitmap, 線程突然停止的話就會發(fā)生一些意想不到的bug, 而且這個api已經(jīng)被JAVA棄用作廢了半等,最好不要使用它筒捺。
isInterrupted():
測試線程Thread對象是否已經(jīng)是中斷狀態(tài),但是不清除狀態(tài)標志势就。
interrupted():
內(nèi)部實現(xiàn)是調(diào)用的當前線程的isInterrupted()泉瞻,并且會重置當前線程的中斷狀態(tài),(取反,如果連續(xù)調(diào)用兩次該方法,則第二次調(diào)用將返回 false (在第一次調(diào)用線程中斷被忽略,因為在中斷時不處于活動狀態(tài)的線程將由此返回 false 的方法反映出來))
interrupt():建議使用
interrupt是中斷的意思,調(diào)用interrupt()方法僅僅是在當前線程中打了一個停止的標記,并不是真正停止線程;
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i ++){
try {
Thread.sleep(100);
Log.e("interrupt","thread run" + i);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
}
});
thread.start();
Log.e("interrupt","thread sleep" + "");
try {
Thread.sleep(500);
} catch (InterruptedException e){
e.printStackTrace();
}
thread.interrupt();
Log.e("interrupt","thread end");
09-28 17:14:54.234 2210-2210/com.example.administrator.javademo E/interrupt: thread sleep
09-28 17:14:54.334 2210-2323/com.example.administrator.javademo E/interrupt: thread run0
09-28 17:14:54.434 2210-2323/com.example.administrator.javademo E/interrupt: thread run1
09-28 17:14:54.534 2210-2323/com.example.administrator.javademo E/interrupt: thread run2
09-28 17:14:54.644 2210-2323/com.example.administrator.javademo E/interrupt: thread run3
09-28 17:14:54.734 2210-2210/com.example.administrator.javademo E/interrupt: thread end
09-28 17:14:54.734 2210-2323/com.example.administrator.javademo W/System.err: java.lang.InterruptedException
安全終止線程, 可以再加多一個判斷, 使用 this.interrupted() 來判斷當前線程是否停止了 ,如果停止就不往下執(zhí)行 ,直接跳出循環(huán)體;
if (this.interrupted()){
break;
}
或者:
if (this.interrupted()) {
throw new InterruptedException();
}