博客
关于我
停止线程之异常法以及在沉睡中停止线程
阅读量: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/

你可能感兴趣的文章
mysql中json_extract的使用方法
查看>>
mysql中json_extract的使用方法
查看>>
mysql中kill掉所有锁表的进程
查看>>
mysql中like % %模糊查询
查看>>
MySql中mvcc学习记录
查看>>
mysql中null和空字符串的区别与问题!
查看>>
MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
查看>>
MYSQL中TINYINT的取值范围
查看>>
MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
查看>>
Mysql中varchar类型数字排序不对踩坑记录
查看>>
MySQL中一条SQL语句到底是如何执行的呢?
查看>>
MySQL中你必须知道的10件事,1.5万字!
查看>>
MySQL中使用IN()查询到底走不走索引?
查看>>
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>
mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
查看>>
Mysql中各类锁的机制图文详细解析(全)
查看>>