博客
关于我
停止线程之异常法以及在沉睡中停止线程
阅读量: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 InnoDB存储引擎中的checkpoint技术
查看>>
Mysql InnoDB存储引擎中缓冲池Buffer Pool、Redo Log、Bin Log、Undo Log、Channge Buffer
查看>>
MySQL InnoDB引擎的锁机制详解
查看>>
Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
查看>>
mysql InnoDB数据存储引擎 的B+树索引原理
查看>>
mysql innodb通过使用mvcc来实现可重复读
查看>>
mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目...
查看>>
mysql interval显示条件值_MySQL INTERVAL关键字可以使用哪些不同的单位值?
查看>>
Mysql join原理
查看>>
MySQL Join算法与调优白皮书(二)
查看>>
Mysql order by与limit混用陷阱
查看>>
Mysql order by与limit混用陷阱
查看>>
mysql order by多个字段排序
查看>>
MySQL Order By实现原理分析和Filesort优化
查看>>
mysql problems
查看>>
mysql replace first,MySQL中处理各种重复的一些方法
查看>>
MySQL replace函数替换字符串语句的用法(mysql字符串替换)
查看>>
mysql replace用法
查看>>
Mysql Row_Format 参数讲解
查看>>
mysql select, from ,join ,on ,where groupby,having ,order by limit的执行顺序和书写顺序
查看>>