interrupt 中断线程

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created by csj on 2017/3/4.
 *
 * 实现多线程的两种方式:1. extends Thread  , implements Runnable,Thread 也是implements Runnable 接口,这两者之间存在多态关系
 * Thread ,Runnable 之间的不同:Thread 类创建的线程不支持多继承, implements Runnable 可以实现多继承
 * Thread ,Runnable 之间的相同:用这两种方式创建的进程在工作时的性质时一样
 * 如何正确有效更好的停止线程,什么叫停止:该线程处理完任务完之前停掉,放弃正在做的操作.
 * Thread.stop()该方法已经废弃,而且该方法是不安全的。
 * Thread.interrupt() 在当前线程打了一个停止的标记,还没停止,需要加一个判断;
 * this.interrupted() 测试当前线程是否已经中断,你说哪个线程?就是运行这个方法的线程! 该方法具体清除状态的功能,也就是说当该线程是标志的状态为true时,调用该方法之后,状态就会变为false
 * this.isInterrupted() 测试线程是否已经中断,与interrupted 的区别是该方法不会清除线程的状态标志
 */
public class Threadrun extends Thread{

    public static final Logger logger = LoggerFactory.getLogger(ThreadTest.class);

    public Threadrun(){
        logger.info("thread name = {}",Thread.currentThread().getName());
    }

    @Override
    public void run() {
        super.run();
        for(int i =0 ; i<3; i++){
            try {
                logger.info("thread isInterrupt1 = {} , isInterrupt2 = {}", this.isInterrupted(), this.isInterrupted());
                if(this.isInterrupted()){
                    logger.info("thread  interrupt1 = {} ,interrupt2 = {}", this.interrupted(), this.interrupted());
                   throw new InterruptedException();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
                break;
            }
            logger.info("i = {} ", i);
        }
    }
}
 
 
 
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created by csj on 2017/3/4.
 */
public class ThreadTest {
    public static final Logger logger = LoggerFactory.getLogger(ThreadTest.class);
    public static void main(String args[]) throws InterruptedException {
        try{
            Threadrun threadrun = new  Threadrun();
            threadrun.start();
            threadrun.interrupt(); //中断线程
            threadrun.sleep(15); //在指定的毫秒数内让当前正在执行的线程休眠,或者说暂停执行;

            logger.info("thread  islive = {}, interrupted = {}",
                    threadrun.isAlive(), //判断线程是否处于活动状态;
                    threadrun.interrupted()//测试当前线程是否已经是中断状态,执行后具有将状态标志清除为false;
            );
        }catch(InterruptedException e){
            e.getStackTrace();
        }
    }
}

2017-03-04 22:01:21.479 [main] INFO  ThreadTest - thread name = main
2017-03-04 22:01:21.485 [Thread-0] INFO  ThreadTest - thread isInterrupt1 = true , isInterrupt2 = true
2017-03-04 22:01:21.485 [Thread-0] INFO  ThreadTest - thread  interrupt1 = true ,interrupt2 = false
java.lang.InterruptedException
at Threadrun.run(Threadrun.java:32)
2017-03-04 22:01:21.505 [main] INFO  ThreadTest - thread  islive = false, interrupted = false

说明参考:
从日志中的第一行可以看出运行main()的的线程名称为 main,由Threadrun 中的构造函数产生。

从日志中的第二行可以看出 isInterrupted() 方法没有清除表标识的功能,因为第二次调用该方法状态依然为true,
 
从日志中的第三行可以看出, interrupted()具有清除状态的功能,因为第二次调用该方法时对应的线程状态的标识已经为false,该条日志是在进入if条件之后才能产生,
 
进入if之后抛出异常,在第四第五行可以看出,通过break结束循环
 
从日志的第六行可以看出名称为main的线程的live状态为false。说明该线程已经停止

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值