当前位置: 首页 > news >正文

上海创新网站建设/站长统计代码

上海创新网站建设,站长统计代码,千页网素材官网入口,2018做网站前景如何概述 之前讲解Thread类中方法的时候,interrupt()、interrupted()、isInterrupted()三个方法没有讲得很清楚,只是提了一下。现在把这三个方法同一放到这里来讲,因为这三个方法都涉及到多线程的一个知识点----中断机制。 Java没有提供一种安全…

概述

之前讲解Thread类中方法的时候,interrupt()、interrupted()、isInterrupted()三个方法没有讲得很清楚,只是提了一下。现在把这三个方法同一放到这里来讲,因为这三个方法都涉及到多线程的一个知识点----中断机制。

Java没有提供一种安全、直接的方法来停止某个线程,而是提供了中断机制。中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理。有个例子举个蛮好,就像父母叮嘱出门在外的子女要注意身体一样,父母说了,但是子女是否注意身体、如何注意身体,还是要看自己。

中断机制也是一样的,每个线程对象里都有一个标识位表示是否有中断请求(当然JDK的源码是看不到这个标识位的,是虚拟机线程实现层面的),代表着是否有中断请求。

 

三个中断方法

上面说了,中断标识位是JDK源码看不到的,是虚拟机线程实现层面的。下面结合代码逐一看一下这三个方法的作用,以及为什么中断标识位是虚拟机实现层面的:

1、interrupt()

public void interrupt() {if (this != Thread.currentThread())checkAccess();synchronized (blockerLock) {Interruptible b = blocker;if (b != null) {interrupt0();        // Just to set the interrupt flagb.interrupt();return;}}interrupt0();}
1 /* Some private helper methods */
2 private native void setPriority0(int newPriority);
3 private native void stop0(Object o);
4 private native void suspend0();
5 private native void resume0();
6 private native void interrupt0();

分两部分看:

(1)第一部分的第8行注释说得很清楚了,interrupt0()方法的作用是"Just to set the interrupt flag",即方法的作用仅仅是设置中断标识位

(2)第二部分的第6行就是interrupt0()方法的原型,由于方法是被native修饰的,很明显这是一个本地方法,是Java虚拟机实现的

2、isInterrupted()

方法唯一的作用只是测试线程是否已经中断,中断标识位的状态并不受到该方法的影响,看一下Java是如何实现这个方法的:

/*** Tests whether this thread has been interrupted.  The <i>interrupted* status</i> of the thread is unaffected by this method.** <p>A thread interruption ignored because a thread was not alive * at the time of the interrupt will be reflected by this method * returning false.** @return  <code>true</code> if this thread has been interrupted;*          <code>false</code> otherwise.* @see     #interrupted()* @revised 6.0*/
public boolean isInterrupted() {
return isInterrupted(false);
}
private native boolean isInterrupted(boolean ClearInterrupted);

注意一下第一部分的第2行和第3行,"The interrupted statis of the thread is unaffected by this method",即线程的中断状态不受到这个方法的影响。最终调用的是isInterrupted(boolean ClearInterrupted),这个方法是一个native的,看得出也是Java虚拟机实现的。方法的参数ClearInterrupted,顾名思义,清除中断标识位,这里传递false,明显就是不清除

3、interrupted()

方法的作用是测试当前线程是否已经中断,线程的中断标识位由该方法清除。换句话说,连续两次调用该方法的返回值必定是false。看一下这个方法是如何实现的:

/*** Tests whether the current thread has been interrupted.  The* <i>interrupted status</i> of the thread is cleared by this method.  In* other words, if this method were to be called twice in succession, the* second call would return false (unless the current thread were* interrupted again, after the first call had cleared its interrupted* status and before the second call had examined it).** <p>A thread interruption ignored because a thread was not alive * at the time of the interrupt will be reflected by this method * returning false.** @return  <code>true</code> if the current thread has been interrupted;*          <code>false</code> otherwise.* @see #isInterrupted()* @revised 6.0*/
public static boolean interrupted() {
return currentThread().isInterrupted(true);
private native boolean isInterrupted(boolean ClearInterrupted);

同样,第2行和第3行的注释已经写得很清楚了,"The interrupted status of the thread is cleared by this method",即线程的中断状态由此方法清除。另外,interrupted()方法和isInterrupted()方法调用的是同一个native方法,无非这个方法传入的是true,表示清除中断标识位

此外,JDK API中有些类的方法也可能会调用中断,比如FutureTask的cancel,如果传入true则会在正在运行的异步任务上调用interrupt()方法,又如ThreadPoolExecutor中的shutdownNow方法会遍历线程池中的工作线程并调用线程的interrupt()方法。这些场景下只要代码没有对中断作出响应,那么任务将一直执行下去。

 

中断处理时机

这其实是一个很宽泛的、没有标注答案的话题。显然,作为一种协作机制,不会强求被中断的线程一定要在某个点进行中断处理。实际上,被中断线程只需要在合适的时候处理即可,如果没有合适的时间点,甚至可以不处理。"合适的时间点"就和业务逻辑密切相关了。

处理时机决定着程序的效率和响应的灵敏度。频繁的检查中断可能会导致程序执行效率低下,较少的检查则可能导致中断请求得不到及时响应。在实际场景中,如果性能指标比较关键,可能需要建立一个测试模型来分析最佳的中断检测点,以平衡性能和响应灵敏性

 

线程中断举例

写了这么多理论,写一个例子来演示一下中断:

public static void main(String[] args) throws Exception
{Runnable runnable = new Runnable(){public void run(){while (true){if (Thread.currentThread().isInterrupted()){System.out.println("线程被中断了");return ;}else{System.out.println("线程没有被中断");}}}};Thread t = new Thread(runnable);t.start();Thread.sleep(3000);t.interrupt();System.out.println("线程中断了,程序到这里了");
}

看一下运行结果:

...
线程没有被中断
线程没有被中断
线程没有被中断
线程没有被中断
线程没有被中断
线程中断了,程序到这里了
线程被中断了

代码分为以下几步:

1、main函数起一个t线程

2、main函数3秒钟之后给t线程打一个中断标识位,表示t线程要中断

3、t线程无限轮询自己的中断标识位,中断了则打印、退出,否则一直运行

从控制台上打印的语句看到,3秒钟中断后,打印出该打印的语句后,就停止了。那这种场景就是前面说的"频繁地检查",导致程序效率低下;那如果不频繁地检查呢,比如在while中的else分支中加上Thread.sleep(500),表示500ms即0.5s检查一次,那这种场景就是前面说的"中断得不到及时的响应"。

其实这个例子中,t线程完全可以不用去管这个中断标识位的,不去检查就好了,只管做自己的事情,这说明中断标识位设不设置是别人的事情,处不处理是我自己的事情,没有强制要求必须处理中断。

但是,那些会抛出InterruptedException的方法要除外。像sleep、wait、notify、join,这些方法遇到中断必须有对应的措施,可以直接在catch块中处理,也可以抛给上一层。这些方法之所以会抛出InterruptedException就是由于Java虚拟机在实现这些方法的时候,本身就有某种机制在判断中断标识位,如果中断了,就抛出一个InterruptedException。

 

原文 :https://www.cnblogs.com/xrq730/p/4856361.html

http://www.lbrq.cn/news/1378225.html

相关文章:

  • 主机如何做网站空间/重庆网络推广外包
  • 莆田制作网站企业/手机如何制作网站
  • 日照建站/网络推广大概需要多少钱
  • 成都神速建站/免费正规大数据查询平台
  • 海盗湾的Wordpress安装/搜索引擎优化培训免费咨询
  • 埃及网站后缀/整合营销的特点有哪些
  • 大连外贸网站建设/百度优化大师
  • 高端网站设计思路/seo专业培训机构
  • 做网站怎么查看来访ip/嘉兴网站建设
  • 厦门网站建设2015/百度优化培训
  • 在网站底部给网站地图做链接/东莞网站seo推广
  • 推广网站怎么做模版/首页优化排名
  • 做酒店的网站/北京网讯百度科技有限公司
  • 桂林小学网站建设/西安seo外包公司
  • wordpress中文url/重庆seo网站系统
  • 如何做平台网站/今天今日头条新闻
  • 网站建设制作设计seo优化珠海/百度搜索官方网站
  • 多语言网站建设/广告seo是什么意思
  • 东莞网站建设哪家专业/软文推广文案
  • 软件开发网站能做seo吗/郑州百度推广开户
  • 做网站真辛苦/宁德seo公司
  • 武汉做网站的有哪些/小程序开发公司前十名
  • 河南网站建设的详细策划/网站制作app免费软件
  • 高端网站建设公司哪家专业靠谱/网站流量统计系统
  • 农特产品电商网站建设目标/李江seo
  • 微博分享的网站怎么做/成都seo达人
  • net网站建设/北京公司排名seo
  • 广告设计与制作主修课程有哪些/百度站长工具seo查询
  • 品牌网站建设h5/搜索引擎的设计与实现
  • 推销产品什么网站好/郑州百度网站快速优化
  • 硬件-电容学习DAY1——钽电容失效揭秘:从冒烟到爆炸全解析
  • 机器学习——逻辑回归(LogisticRegression)的核心参数:以约会数据集为例
  • Product Hunt 每日热榜 | 2025-08-01
  • 什么是数据集成?和数据融合有什么区别?
  • WebSocket配置实战:打造稳健高效的消息通信系统
  • 【未解决】STM32无刷电机驱动电路问题记录