加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

07.interrupt

发布时间:2020-12-15 08:02:52 所属栏目:Java 来源:网络整理
导读:/***isInterrupted*/public class InterruptDemo { public static void main(String[] args) throws InterruptedException{ Thread thread = new Thread(new Runnable() { @Override public void run() { while (!Thread.currentThread().isInterrupted()){
/**
*isInterrupted
*/
public class InterruptDemo {
    public static void main(String[] args) throws InterruptedException{
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                while (!Thread.currentThread().isInterrupted()){
                    System.out.println(Thread.currentThread()+"没被中断");
                }
            }
        });
        thread.start();
        Thread.sleep(1000);
        System.out.println("main thread interrupt thread");
        thread.interrupt();
        thread.join();
        System.out.println("main is over");
        //...
        //Thread[Thread-0,5,main]没被中断
        //Thread[Thread-0,main]没被中断
        //main thread interrupt thread
        //Thread[Thread-0,main]没被中断
        //main is over
    }
}
/**
* interrupt()方法打断线程的休眠
*/
public class InterruptDemo2 {
    public static void main(String[] args) throws InterruptedException{
        Thread threadOne = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("threadOne begin sleep for 200 s");
                    Thread.sleep(200000);
                    System.out.println("threadOne waking");
                } catch (InterruptedException e) {
                    System.out.println("threadOne is interrupted while sleeping");
                    return;
                }
                System.out.println("threadOne-leaving normally");
            }
        });
        threadOne.start();
        //确保子线程进入休眠状态
        Thread.sleep(1000);
        //打断子线程的休眠,让子线程从sleep函数返回
        threadOne.interrupt();
        //等待子线程执行完毕
        threadOne.join();
        System.out.println("main thread is over");
        //threadOne begin sleep for 200 s
        //threadOne is interrupted while sleeping
        //main thread is over
        // threadOne 线程休眠了200s,在正常情况下该线程需要等到 200s 后才会被唤醒,
        // 但是通过调用 threadOne.interrupt()方法打断了该线程的休眠,
        // 该线程会在调用 sleep 方法处抛出 InterruptedException 异常后返回

    }
}
/**
 *  interrupted() 与 isInterrupted()
 */
public class InterruptDemo3 {
    public static void main(String[] args) throws InterruptedException{
        Thread threadOne = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){}
            }
        });
        threadOne.start();
        threadOne.interrupt();
        System.out.println("isInterrupted:"+threadOne.isInterrupted());
        System.out.println("isInterrupted:"+threadOne.interrupted());
        System.out.println("isInterrupted:"+Thread.interrupted());
        System.out.println("isInterrupted:"+threadOne.isInterrupted());
        threadOne.join();
        System.out.println("main thread is over");
        //isInterrupted:true
        //isInterrupted:false
        //isInterrupted:false
        //isInterrupted:true
        // 在 interrupted()内部是获取当前调用线程的中断标志而不是调用 interrupted()方法的实例对象的中断标志。
        //  public static boolean interrupted() {
        //        return currentThread().isInterrupted(true);
        //    }
        //在 interrupted()方法内部是获取当前线程的中断状态,这里虽然调用了 threadOne 的 interrupted() 方法,
        //但是获取的是主线程的中断标志,因为主线程是 当前线程。 threadOne.interrupted()和 Thread.interrupted()方法的作用是一样的,
        // 目的都是 获取当前线程的中断标志
    }
}
/**
* interrupted()
*/
public class InterruptDemo4 {
    public static void main(String[] args) throws InterruptedException{
        Thread threadOne = new Thread(new Runnable(){
            @Override
            public void run() {
                //中断标志为true时会退出循环,并清除中断标志
                while (!Thread.currentThread().interrupted()){}
                System.out.println("threadOne interrupted:"+Thread.currentThread().isInterrupted());
            }
        });
        threadOne.start();
        threadOne.interrupt();
        threadOne.join();
        System.out.println("main thread is over");
        //threadOne interrupted:false
        //main thread is over
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读