您的位置:首页 > 其它

多线程——停止线程

2018-02-01 17:23 225 查看
停止线程是多线程中的一个技术点,在Thread类的方法中,与停止线程有关的有: interrupt(),interrupted()和isInterrupted()

还有一个stop()方法,该方法因”unsafe”而被标记为”Deprecated”,

本博客是关于停止线程的探讨,不会涉及到被弃用的方法,作为自我学习总结。

1. 判断线程是否是停止状态

可以参考: 多线程——interrupt(),interrupted()和isInterrupted()

2. 停止线程的方法

Java中在不使用“被弃用的”方法的情况下,停止线程主要由一下两种方式:

使用退出标识,使线程正常退出,也就是当run()方法完成后线程终止;

使用interupt()方法中断线程。

下面是停止线程的具体的方法。

1. 在for循环中判断线程是否停止

在for循环中判断一下当前正在执行的线程是否是停止状态,如果是,则用break退出循环。

代码实例:

/*
* 停止线程:在for循环中判断线程是否停止
*/
public class Test_stopThread1 implements Runnable {

@Override
public void run() {
for(int i=0; i<500000; i++){
if(Thread.currentThread().isInterrupted()){
System.out.println("当前线程:"+Thread.currentThread().getName());
System.out.println("线程中断, 退出for循环");
break;
}
System.out.println("i=: "+i);
}
System.out.println("已经退出for循环了,如果我被打印了,说明存在语句继续运行的问题=.=");
}

public static void main(String[] args) {
try {
Test_stopThread1 r = new Test_stopThread1();
Thread t = new Thread(r,"test");
t.start();
Thread.sleep(1000);
t.interrupt();    //中断线程t

System.out.println("是否停止?: "+t.isInterrupted());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}


运行结果:



分析:

可以看到,当i=94716时打印停止,for语句退出,50万条数据没有打印完,

但是,for语句后面的语句仍然被执行了,如何解决语句继续运行的问题呢?可以使用下面的这种方法。

2. 在for循环中判断线程是否停止,强行抛出异常

与上面类似,都需要在for循环中判断一当前正在执行的线程是否是停止状态,如果是,则用强行抛出InterruptedException异常,

这样做就不会有语句继续运行的问题了。

代码实例:

/*
* 停止线程:在for循环中判断线程是否停止,强制抛出异常
*/
public class Test_stopThread2 implements Runnable {

@Override
public void run() {
try {
for(int i=0; i<500000; i++){
if(Thread.currentThread().isInterrupted()){
System.out.println("当前线程:"+Thread.currentThread().getName());
System.out.println("线程中断, 退出for循环");
throw new InterruptedException();  //强行抛出异常
}
System.out.println("i=: "+i);
}
System.out.println("已经退出for循环了,如果我被打印了,说明存在语句继续运行的问题=.=");
} catch (InterruptedException e) {
System.out.println("进入到了run()方法的catch了~");
e.printStackTrace();
}
}

public static void main(String[] args) {

try {
Test_stopThread2 r = new Test_stopThread2();
Thread t = new Thread(r,"test");
t.start();
Thread.sleep(1000);
t.interrupt();    //中断线程t

System.out.println("是否停止?: "+t.isInterrupted());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}


运行结果:



分析:

可以看到,当i=93800时打印停止,for语句退出,50万条数据没有打印完,抛出InterruptedException异常,也没有语句继续执行的问题了~

参考书籍:《Java多线程编程核心技术》,感谢作者~

献上昨夜的月食美照~

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: