创建线程的两种方法:
- 继承Thread, 并实现run方法;
- 实现Runnable;
不管是使用哪一种方法创建线程,run方法的任务执行完了,线程就自动停止.
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()可以停止一个线程,但是这个方法是不安全的,因为如果线程中操作的是一些复杂一点的对象,例如bitmap, 线程突然停止的话就会发生一些意想不到的bug, 而且这个api已经被JAVA弃用作废了,最好不要使用它。
isInterrupted():
测试线程Thread对象是否已经是中断状态,但是不清除状态标志。
interrupted():
内部实现是调用的当前线程的isInterrupted(),并且会重置当前线程的中断状态,(取反,如果连续调用两次该方法,则第二次调用将返回 false (在第一次调用线程中断被忽略,因为在中断时不处于活动状态的线程将由此返回 false 的方法反映出来))
interrupt():建议使用
interrupt是中断的意思,调用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() 来判断当前线程是否停止了 ,如果停止就不往下执行 ,直接跳出循环体;
if (this.interrupted()){
break;
}
或者:
if (this.interrupted()) {
throw new InterruptedException();
}