在多线程开发时,停止线程是很重要的一个技术,因此,如何正确停止一个线程,对于从事多线程开发的人员是很重要且十分必要的。
1. 什么是停止线程?
所谓停止线程,就是让一个正在处理任务的线程,停止继续执行,放弃当前任务的操作。
2. 判断线程是否是停止状态的方法?
Thread.java类中提供了;两种方法进行判断,分别是:interrupted()和isInterrupted()方法。
Interrupted():测试当前线程是否已经中断。执行后具有清除中断状态的功能。
isInterrupted():测试线程都否已经中断。没有清除中断状态的功能。
3. Java中如何正确停止线程
JDK1.2以前通过使用stop()方法来停止线程。但是,JDK1.2之后,该方法就被废弃了。


为什么stop()方法被废弃而不被使用呢?原因是stop()方法太过于暴力,会强行把执行一半的线程终止。这样会就不会保证线程的资源正确释放,通常是没有给与线程完成资源释放工作的机会,因此会导致程序工作在不确定的状态下。造成数据的不同步。

JDK1.2之后Java中通常使用interrupt()方法,停止一个线程。
但是,直接调用该方法不会终止一个正在运行的线程,需要加入一个判断语句才可以完成线程的停止。例子如下:
package cn.thread.core; /** * 测试interrupt()方法 * @author 温暖wk *
结论:直接调用interrupt()方法,不能正确停止线程 * 分析:因为调用interrupt()方法不能立即停止线程,仅仅是在当前线程中打了一个停止的
*标记,并不是真的停止线程。 */ public class Demo01 extends Thread { //重写run()方法 public void
run() { for(int i=0;i<50;i++) { System.out.println("i="+(i+1)); } } public
static void main(String[] args) { Demo01 t1=new Demo01();//使用Java支持多线程的类创建线程t1
t1.start();try { Thread.sleep(1000); } catch (InterruptedException e) {
System.out.println("main catch"); e.printStackTrace(); } t1.interrupt(); } }
所以,在使用interrupt()方法时,加入if语句判断线程是否是停止状态,如果是,则停止后面代码的执行。例子如下:
package cn.thread.core; /** * 使用异常,停止线程 * @author 温暖wk *
结论:能正确停止线程,且for循环后面的语句不会执行 * 使用抛出异常的方法解决 */ public class Demo03 extends Thread{
@Override public void run() { for(int i=0;i<500000;i++) {//只有循环足够多,才能看到线程停止 if(
this.interrupted()) {//用Threa.interrupted有什么不同? System.out.println(
"已经是停止状态了!我要退出"); //break; for循环后面如果有语句会继续执行 try { throw new
InterruptedException(); }catch (InterruptedException e) { // TODO
Auto-generated catch block e.printStackTrace(); } } System.out.println("i="+(i+1
)); } }public static void main(String[] args) { Demo03 t3=new Demo03();
t3.start();//启动一个线程 try { Thread.sleep(1000); } catch (InterruptedException e)
{ e.printStackTrace(); } t3.interrupt(); System.out.println("end"); } }

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信