摘要:很多开发人员包括我,尤其是刚进入软件行业的新手,认为设置线程中断就是表示线程停止了,不往前执行了,其实不是这样的,线程中断只是一个状态而已,表示已中断,表示未中断获取线程中断状态,如果中断了返回否则返回设置线程中断不影响线程的继续执行,但是
很多Java开发人员(包括我),尤其是刚进入软件行业的新手,认为Java设置线程中断就是表示线程停止了,不往前执行了,
Thread.currentThread().interrupt()
其实不是这样的,线程中断只是一个状态而已,true表示已中断,false表示未中断
//获取线程中断状态,如果中断了返回true,否则返回false
Thread.currentThread().isInterrupted()
设置线程中断不影响线程的继续执行,但是线程设置中断后,线程内调用了wait、jion、sleep方法中的一种, 立马抛出一个 InterruptedException,且中断标志被清除,重新设置为false。
class Thread2 implements Runnable{
@Override public void run() { try { System.out.println(); System.out.println(hread.currentThread().isInterrupted());//输出false Thread.currentThread().interrupt();//当前线程中断 System.out.println("Thread.currentThread().isInterrupted());//输出true Thread.sleep(3000);//中断后执行sleep会抛出异常 } catch (InterruptedException e) { e.printStackTrace(); System.out.println("Thread.currentThread().isInterrupted());//输出false } } }
该如何让线程真正停止不往前执行呢:
真正让线程停止下来(阻塞),Java提供了一个较为底层的并发工具类:LockSupport,该类常用的方法有两个,1
park(Object blocker) 表示阻塞指定线程,参数blocker当前线程对象 2 unpark(Thread thread) 唤醒指定线程,参数thread指定线程对象
示例:
public void test_LockSupport(){ Thread thread=new Thread(new Thread_park()); thread.start();//阻塞当前线程 Thread thread2=new Thread(new Thread_unpark(thread)); thread2.start();//唤醒被阻塞的线程 } class Thread_park implements Runnable{ @Override public void run() { System.out.println("Thread_park开始"); LockSupport.park(this);//阻塞当前线程 System.out.println("Thread_park结束"); } } class Thread_unpark implements Runnable{ private Thread thread; public Thread_unpark(Thread thread) { this.thread = thread; } @Override public void run() { System.out.println("Thread_unpark开始"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } LockSupport.unpark(thread);//唤醒被阻塞的线程 System.out.println("Thread_unpark结束"); } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/77127.html
摘要:表示一个异步任务的结果,就是向线程池提交一个任务后,它会返回对应的对象。它们分别提供两个重要的功能阻塞当前线程等待一段时间直到完成或者异常终止取消任务。此时,线程从中返回,然后检查当前的状态已经被改变,随后退出循环。 0 引言 前段时间需要把一个C++的项目port到Java中,因此时隔三年后重新熟悉了下Java。由于需要一个通用的线程池,自然而然就想到了Executors。 用了...
摘要:无限期等待另一个线程执行特定操作。线程安全基本版请说明以及的区别值都不能为空数组结构上,通过数组和链表实现。优先考虑响应中断,而不是响应锁的普通获取或重入获取。只是在最后获取锁成功后再把当前线程置为状态然后再中断线程。 前段时间在慕课网直播上听小马哥面试劝退(面试虐我千百遍,Java 并发真讨厌),发现讲得东西比自己拿到offer还要高兴,于是自己在线下做了一点小笔记,供各位参考。 课...
摘要:同步器的实现根据其状态是否独占而有所不同。这个框架为同步状态的原子性管理线程的阻塞和解除阻塞以及排队提供了一种通用的机制。在需要使用同步器的目标类中,继承了的子类要求被声明为目标类的非公有内部类。类通过一组方法实现线程的阻塞和解除阻塞。 java.util.concurrent.locks包主要是提供线程通信的锁,下面看一下包中有哪些类。 showImg(https://segment...
摘要:此对象在线程受阻塞时被记录,以允许监视工具和诊断工具确定线程受阻塞的原因。阻塞当前线程,最长不超过纳秒,返回条件在的基础上增加了超时返回。唤醒线程唤醒处于阻塞状态的线程。 LockSupport 用法简介 LockSupport 和 CAS 是Java并发包中很多并发工具控制机制的基础,它们底层其实都是依赖Unsafe实现。 LockSupport是用来创建锁和其他同步类的基本线程阻塞...
阅读 1116·2021-11-23 10:04
阅读 2382·2021-11-22 15:29
阅读 2671·2021-11-19 09:40
阅读 698·2021-09-22 15:26
阅读 2098·2019-08-29 16:27
阅读 2469·2019-08-29 16:10
阅读 1887·2019-08-29 15:43
阅读 3251·2019-08-29 12:43