终止线程的运行
终止线程的执行
一、强制终止线程的执行
强制终止用的是stop()方法,因为这种方法会丢失数据,所以一般不采用这种方法。
原理是直接杀死线程,这样的话线程中没有保存的数据就会丢失
/*
在java中强制终止一个线程
*/
public class ThreaTest09 {
public static void main(String[] args) {
Thread t=new Thread(new Thread09());
t.setName("t");
t.start();
try {
Thread.sleep(1000*5);
} catch (InterruptedException e) {
e.printStackTrace();
}
//stop()强行终止,容易丢失数据,这种方式是直接杀死线程,线程没有保存的数据会丢失。不建议使用
t.stop();
}
}
//一秒打印一个数字
class Thread09 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"----> begin"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
输出:
t----> begin0
t----> begin1
t----> begin2
t----> begin3
t----> begin4
可以看出,我们在主线程当中的休眠5s并没有执行!
二、合理终止线程的执行
既然上面那种方法会有容易丢失数据的缺点,那么我们在线程的操作中怎么去合理终止线程的运行呢?
我们可以定义一个布尔值,用来控制线程的结束
代码:
public class ThreadTest10 {
public static void main(String[] args) {
Thread10 thread10 = new Thread10();
Thread t=new Thread(thread10);
t.setName("t");
t.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread10.run=false;
}
}
class Thread10 implements Runnable{
boolean run=true;
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if (run){
System.out.println(Thread.currentThread().getName()+"----->"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
//终止当前线程
//return就是结束,如果还有未保存的可以在这里执行保存,然后再结束
//save....
return;
}
}
}
}
输出:
t----->0
t----->1
t----->2
t----->3
t----->4
可以看出在程序中正常执行,当主线程休眠5s之后就调开始执行,把true改为false停止了程序,线程正常结束!
本文来自博客园,作者:星余明,转载请注明原文链接:https://www.cnblogs.com/lingstar/p/16534431.html