前言:
前面我们对线程的中断机制有了一定了解,线程中断机制可以在某些情况下可以实现线程的终止,使线程进入TERMINATED状态,但是线程的终止方法不止于这一种,为了更好地了解线程的终止,通过自己写代码并学会了如何优雅地终止线程。
通过搜集一些网上资料,大多数提到的就是常用的三种方法:
1.通过设置标志位,线程通过判断标志位的方式来终止线程
2.调用线程的中断方法,设置中断状态,线程在恰当的时候进行终止
3.调用stop方法,不建议使用,因为在Thread源码-start及stop方法章节中已经说明了该方法的弊端
纸上得来终觉浅,绝知此事要躬行,上代码!
方式1
代码如下:
package com.thread.service;
import java.util.concurrent.TimeUnit;
/**
* @author ignore1992
*
* 2018年7月18日
*/
public class ThreadStop1 extends Thread
{
/** 设置标志位. **/
private volatile boolean exit = false;
@Override
public void run()
{
while (!exit)
{
System.out.println("ThreadStop1执行中...");
try
{
Thread.sleep(TimeUnit.SECONDS.toMillis(1L));
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
System.out.println("退出ThreadStop1...");
}
/**
* @param exit
* the exit to set
*/
public void setExit(boolean exit)
{
this.exit = exit;
}
public static void main(String[] args)
{
// 1.测试通过设置标志位来终止线程
ThreadStop1 stop1 = new ThreadStop1();
stop1.start();
try
{
Thread.sleep(1000L);
} catch (InterruptedException e)
{
e.printStackTrace();
}
stop1.setExit(true);
}
}
方式二
代码如下:
package com.thread.service;
import java.util.concurrent.TimeUnit;
/**
* @author ignore1992
*
* 2018年7月18日
*/
public class ThreadStop2 extends Thread
{
@Override
public void run()
{
while (true)
{
System.out.println("ThreadStop2执行中...");
try
{
Thread.sleep(TimeUnit.SECONDS.toMillis(1L));
} catch (InterruptedException e)
{
System.out.println("退出ThreadStop2...");
break;
}
}
}
public static void main(String[] args)
{
// 2.测试通过中断来终止线程
ThreadStop2 stop2 = new ThreadStop2();
stop2.start();
try
{
Thread.sleep(1000L);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
stop2.interrupt();
}
}
方式三
代码如下:
package com.thread.service;
import java.util.concurrent.TimeUnit;
/**
* @author ignore1992
*
* 2018年7月18日
*/
public class ThreadStop3 extends Thread
{
@Override
public void run()
{
while(true)
{
System.out.println("ThreadStop3执行中...");
try
{
Thread.sleep(TimeUnit.SECONDS.toMillis(1L));
}
catch (InterruptedException e)
{
System.out.println("ThreadStop3抛InterruptedException异常");
}
}
}
public static void main(String[] args)
{
// 3.测试通过stop方法来中断线程(有风险,不建议用)
ThreadStop3 stop3 = new ThreadStop3();
stop3.start();
try
{
Thread.sleep(1000L);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
stop3.stop();
}
}
总结:
1.虽然终止线程是一个比较不常用的操作,但是我们还是要了解如何正确地使用,如上建议使用前两种方式