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

你可能感兴趣的文章
MySQL5.7新增Performance Schema表
查看>>
Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
查看>>
Webpack 之 basic chunk graph
查看>>
Mysql5.7版本单机版my.cnf配置文件
查看>>
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>
Mysql8.0注意url变更写法
查看>>
Mysql8.0的特性
查看>>
MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看>>
MySQL8修改密码的方法
查看>>
Mysql8在Centos上安装后忘记root密码如何重新设置
查看>>
Mysql8在Windows上离线安装时忘记root密码
查看>>
MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
查看>>
mysql8的安装与卸载
查看>>