我是靠谱客的博主 发嗲小蘑菇,最近开发中收集的这篇文章主要介绍并发编程学习(三),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Thread.interrupt()
打断线程 sleep ,wait,join的线程
打断sleep()的线程,会清空打断状态,以sleep()为例

@Slf4j(topic = "juc.test9")
public class test9 {
   public static void main(String[] args) throws InterruptedException {
       Thread t1=new Thread(()->{
           try {
               Thread.sleep(1);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       },"t1");
       t1.start();
       t1.sleep(500);
       t1.interrupt();
       log.debug("打断状态:{}",t1.isInterrupted());
   }
}
运行结果:14:38:17.841 [main] DEBUG juc.test9 - 打断状态:false
package juc;

import lombok.extern.slf4j.Slf4j;

@Slf4j(topic = "juc.test10")
public class test10 {
   public static void main(String[] args) throws InterruptedException {

       Thread t1=new Thread(()->{
           while (true){
               boolean interrupted = Thread.currentThread().isInterrupted();
               if (interrupted){
                   log.debug("被打断了,退出循环");
                   break;
               }
           }
       },"t1");
       t1.start();
       Thread.sleep(1000);
       log.debug("interript");
       t1.interrupt();
   }
}
16:40:34.133 [main] DEBUG juc.test10 - interript
16:40:34.143 [t1] DEBUG juc.test10 - 被打断了,退出循环

使用线程stop()方法停止线程
stop()方法没有真正杀死线程,如果这时线程锁住了共享资源,那么当它本杀死后就再也没有机会释放了,其他线程永远无法获取锁
使用System.exit(int)停止线程
目的是停止一个线程,但是这个方法会让整个线程都停止

两阶段终止模式

package juc;

import lombok.extern.slf4j.Slf4j;

@Slf4j(topic = "juc.test11")
public class test11 {
    public static void main(String[] args) throws InterruptedException {
    TwoPhaseTermination tpt=new TwoPhaseTermination();
    tpt.start();
    Thread.sleep(3500);
    tpt.stop();

    }
}
@Slf4j(topic = "juc.TwoPhaseTermination")
class TwoPhaseTermination{
    private Thread monitor;
//    启动监控线程
    public void  start(){
        monitor=new Thread(()->{

            while (true){
                Thread current=Thread.currentThread();
                if (current.isInterrupted()){
                    log.debug("料理后事");
                    break;
                }
                try {
                    Thread.sleep(1000);
                    log.debug("执行监控记录");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    current.interrupt();
//                    重新设置打断标记
                }
            }
        });
        monitor.start();
    }
//    停止监控线程
    public void  stop(){
        monitor.interrupt();
    }
}

23:29:37.354 [Thread-0] DEBUG juc.TwoPhaseTermination - 执行监控记录
java.lang.InterruptedException: sleep interrupted
	at java.lang.Thread.sleep(Native Method)
	at juc.TwoPhaseTermination.lambda$start$0(test11.java:29)
	at java.lang.Thread.run(Thread.java:745)
23:29:37.816 [Thread-0] DEBUG juc.TwoPhaseTermination - 料理后事

isInterrupted(不****会清楚打断标记) 和 interrupted(会清楚打断标记)都是判断线程是否被打断

打断park线程

package juc;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.locks.LockSupport;

@Slf4j(topic = "juc.test12")
public class test12 {
    public static void main(String[] args) throws InterruptedException {
        Thread t1=new Thread(()->{
           log.debug("pack.....");
            LockSupport.park();
            log.debug("upark");
            log.debug("打断状态:{}",Thread.currentThread().isInterrupted());
        },"t1");
        t1.start();
        t1.sleep(1000);
        t1.interrupt();

    }
}

23:42:01.476 [t1] DEBUG juc.test12 - pack.....
23:42:02.486 [t1] DEBUG juc.test12 - upark
23:42:02.486 [t1] DEBUG juc.test12 - 打断状态:true

再一次打断就无法打断了, LockSupport.park();
如果没有打断的话, LockSupport.park();后面也不会在执行
Thread.intrrupted()这个方法就会为假, LockSupport.park();就会再一次生效

stop() 停止线程运行
suspend() 暂停线程运行
resume() 恢复线程运行

这三个方法都不推荐使用,容易造成同步代码块,造成死锁
@Deprecated 都有已经过时的注解

最后

以上就是发嗲小蘑菇为你收集整理的并发编程学习(三)的全部内容,希望文章能够帮你解决并发编程学习(三)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部