博客
关于我
停止线程之异常法以及在沉睡中停止线程
阅读量:289 次
发布时间:2019-03-03

本文共 2863 字,大约阅读时间需要 9 分钟。

一:停止线程之异常法

  1.  简介
       我们推荐使用interrupt()方法来停止线程,但是单纯调用interrupt()方法仅仅是在当前线程中打了一个停止的标记,
       并没有真的停止线程。为了解决这样的问题,我们使用了抛出异常的方法。
  2. 创建继承Thread类的线程类MyThread.java
      
    package com.kgf.test;public class MyThread extends Thread {	@SuppressWarnings("static-access")	@Override	public void run() {		try {			for (int i = 0; i < 500000; i++) {				if(this.interrupted()) {					System.out.println("已经是停止状态了!我要退出了!");					throw new InterruptedException();				}				System.out.println("i="+(i+1));			}			System.out.println("我在for下面");		} catch (Exception e) {			System.out.println("进入catch方法了。。。。。。");			e.printStackTrace();		}	}	}

     

  3. 测试类
        
    package com.kgf.test;public class Run {	public static void main(String[] args) throws InterruptedException {		try {			MyThread myThread = new MyThread();			myThread.start();			Thread.sleep(1000); //此方法代表 让当前线程休眠 1 秒,即表示使 main线程休眠 1秒			myThread.interrupt();//调用停止线程类的方法		} catch (Exception e) {			e.printStackTrace();		}		System.out.println("==========END================");	}}

     

  4. 效果
         
  5. 总结
      建议使用“抛异常”方式来实现线程的停止,因为在catch块中可以对异常信息进行相关的处理
      ,而且使用异常流能更好,更方便的控制程序的运行流程。
                 

二:在沉睡中停止线程

  1. 先sleep再用interrupt()停止
     ⑴创建继承Thread类的线程类MyThread.java
         
    package com.kgf.test;public class MyThread extends Thread {	@Override	public void run() {		try {			System.out.println("===run begin=====");			Thread.sleep(200000);			System.out.println("===run end=====");		} catch (Exception e) {			System.out.println("在沉睡中被停止!进入catch!线程状态为:"+this.isInterrupted());			e.printStackTrace();		}	}	}
     ⑵测试类
        
    package com.kgf.test;public class Run {	public static void main(String[] args) throws InterruptedException {		try {			MyThread myThread = new MyThread();			myThread.start();			Thread.sleep(200);			myThread.interrupt();//调用停止线程类的方法		} catch (Exception e) {			System.out.println("main catch");			e.printStackTrace();		}		System.out.println("==========END================");	}}
     ⑶效果:
        
     ⑷结果分析
         通过上面的代码我们可知,我们是先让MyThread对象线程进入到睡眠状态,然后
       我们再调用interrupt()方法去停止它。从结果看,如果在sleep状态下停止某一线程,
       就会使其进入catch语句,并且清除停止状态值,使其变成false.       
  2. 先interrupt()停止再sleep
     ⑴创建继承Thread类的线程类MyThread.java
       
    package com.kgf.test;public class MyThread extends Thread {	@Override	public void run() {		try {			for (int i = 0; i < 500000; i++) {				System.out.println("i="+(i+1));			}			System.out.println("===run begin=====");			Thread.sleep(200000);			System.out.println("===run end=====");		} catch (Exception e) {			System.out.println("先停止!再遇到了sleep!进入catch!线程状态为:"+this.isInterrupted());			e.printStackTrace();		}	}	}
     ⑵测试类 
        
    package com.kgf.test;public class Run {	public static void main(String[] args) throws InterruptedException {		try {			MyThread myThread = new MyThread();			myThread.start();			myThread.interrupt();//调用停止线程类的方法		} catch (Exception e) {			System.out.println("main catch");			e.printStackTrace();		}		System.out.println("==========END================");	}}
     ⑶效果
        
     ⑷结果分析
        从上面结果可知,当我们先执行interrupt()方法时,myThread线程会一直运行到sleep()方法
       时才进入catch语句中,不会立刻停止。  
              

转载地址:http://cfql.baihongyu.com/

你可能感兴趣的文章
mongodb定时备份数据库
查看>>
mppt算法详解-ChatGPT4o作答
查看>>
mpvue的使用(一)必要的开发环境
查看>>
MQ 重复消费如何解决?
查看>>
mqtt broker服务端
查看>>
MQTT 保留消息
查看>>
MQTT 持久会话与 Clean Session 详解
查看>>
MQTT工作笔记0007---剩余长度
查看>>
MQTT工作笔记0009---订阅主题和订阅确认
查看>>
Mqtt搭建代理服务器进行通信-浅析
查看>>
MS Edge浏览器“STATUS_INVALID_IMAGE_HASH“兼容性问题
查看>>
ms sql server 2008 sp2更新异常
查看>>
MS UC 2013-0-Prepare Tool
查看>>
MSBuild 教程(2)
查看>>
msbuild发布web应用程序
查看>>
MSB与LSB
查看>>
MSCRM调用外部JS文件
查看>>
MSCRM调用外部JS文件
查看>>
MSEdgeDriver (Chromium) 不适用于版本 >= 79.0.313 (Canary)
查看>>
MsEdgeTTS开源项目使用教程
查看>>