博客
关于我
停止线程之异常法以及在沉睡中停止线程
阅读量: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查询结果排序
查看>>
MYSQL查询语句优化
查看>>
mysql查询语句能否让一个字段不显示出来_天天写order by,你知道Mysql底层执行原理吗?
查看>>
MySQL查询语句:揭秘专家秘籍,让你秒变数据库达人!
查看>>
MySQL死锁套路:一次诡异的批量插入死锁问题分析
查看>>
Mysql死锁问题Deadlock found when trying to get lock;try restarting transaction
查看>>
mysql每个数据库的最大连接数_MySQL数据库最大连接数
查看>>
Mysql流程控制结构,if函数、case结构、if结构、循环结构
查看>>
mysql添加外网访问权限
查看>>
mysql添加用户
查看>>
MySQL添加用户、删除用户与授权
查看>>
mysql添加用户及权限
查看>>
Mysql添加用户并授予只能查询权限
查看>>
mysql添加用户权限报1064 - You have an error in your SQL syntax问题解决
查看>>
mysql添加索引
查看>>
mysql添加表注释、字段注释、查看与修改注释
查看>>
mysql清理undo线程_MySQL后台线程的清理工作
查看>>
mysql清空带外键的表
查看>>
MySQL清空表数据
查看>>
mysql源码安装
查看>>