这个问题也是java多线程中的一个重要的问题.一般有两种方法.但是推荐第一种方法
一,标志位
- public void run() {
- //每次循环都检测标志位是否发生改变
- while(!isExit){
- counter++;
- System.out.println(Thread.currentThread().getName()+" "+counter );
- }
- System.out.println("退出循环,线程结束");
- }
复制代码
通过标志位的方法我们可以很自然和温柔随和的把一个线程终止掉.java中没有一种安全的抢占式方法来停止线程,因为也就没有安全的抢占式方法来停止线程.但是他有一种协作式的机制,是请求取消的任务和代码都遵循一种协商好的协议.,设置”已经请求取消”标志,而任务将定时的查看该标志.如果调用sleep或者wait()方法,线程将会处于睡眠或者阻塞状态那么这种方法将会不起作用——-任务可能永远不会检查取消标志,因此永远无法结束
二,捕获中断异常
- public void run() {
- synchronized (this) {
- while (true) {
- System.out.println("time = " + System.currentTimeMillis());
- counter++;
- try {
- if (counter == 5) {
- // 使线程处于阻塞状态
- wait();
- }
- } catch (InterruptedException e) {
- // 捕获InterruptedException,然后退出程序
- System.out.println("捕获到InterruptedException , 线程结束");
- return;
- }
- }
- }
- }
复制代码
通过这种方式我们要明确如下几点:
1,每个线程都有一个boolean类型的中断状态.当中断线程时,这个线程的中断状态将被设置为true.
2,interrupt方法能够中断目标线程,而isInterrupted方法能返回目标线程的中断状态.静态的interrupted方法将清除当前线程的中断状态,并返回它之前的值,这也是清除中断状态的唯一方法.
3,响应中断执行的操作: 清除中断状态, 抛出InterruptedException,表示阻塞操作由于中断提前结束.JVM并不能保证阻塞方法检测到中断的速度,但在实际情况中响应速度还是非常快的.
4,调用interrupt并不意味着立即停止目标线程正在进行的工作,而只是传递了请求中断的消息.
5,一般而言,中断是实现取消的最合理方式
希望能帮到你 |