今天看ThreadPoolExecutor的代码,其中有一个addWorker的函数,里面有个retry的标签,从来没遇到过这种用法。来深入探究一下。

先看一下addWorker的代码。

private boolean addWorker(Runnable firstTask, boolean core) {retry:for (;;) {int c = ctl.get();int rs = runStateOf(c);// Check if queue empty only if necessary.if (rs >= SHUTDOWN &&! (rs == SHUTDOWN &&firstTask == null &&! workQueue.isEmpty()))return false;for (;;) {int wc = workerCountOf(c);if (wc >= CAPACITY ||wc >= (core ? corePoolSize : maximumPoolSize))return false;if (compareAndIncrementWorkerCount(c))break retry;c = ctl.get();  // Re-read ctlif (runStateOf(c) != rs)continue retry;// else CAS failed due to workerCount change; retry inner loop}}
...
}

我们先来猜测一下,retry不是java中的关键字,这应该类似标签的一种写法,看起来有点像goto;break retry可能是跳出到retry标签处(继续执行retry标签下的循环,保留最外层循环的变量临时值),continue retry直接跳出标签(不管标签中有几层循环),继续执行其他代码。实际是不是这样呢?

show me the demo code!

public class RetryDemo {public static void main(String[] args) {int count = 0;retry:for (int i=0; i<3; i++) {for (int j=0; j<5; j++) {count++;if (count == 4) {continue retry;}System.out.print(count + " ");}}}
}输出结果:
1 2 3 5 6 7 8 9 10 11 12 13 14public class RetryDemo {public static void main(String[] args) {int count = 0;retry:for (int i=0; i<3; i++) {for (int j=0; j<5; j++) {count++;if (count == 4) {break retry;}System.out.print(count + " ");}}}
}输出结果:
1 2 3

聪明的你,看明白为什么输出会是这样么?

再来解释一遍, break label直接跳出到标签处,不再执行循环代码;continue label,只是结束本轮循环,跳转到标签处,继续下一轮循环(本质上与单层循环的break和continue类似)。

写到这里,那提个问题,如果是三层for循环的标签,输出结果是什么呢?

public class RetryDemo {public static void main(String[] args) {int count = 0;retry:for (int i=0; i<3; i++) {for (int k=0; k<2; k++) {for (int j = 0; j < 5; j++) {count++;if (count == 4) {continue retry;}System.out.print(count + " ");}}}}
}输出结果
1 2 3 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24public class RetryDemo {public static void main(String[] args) {int count = 0;retry:for (int i=0; i<3; i++) {for (int k=0; k<2; k++) {for (int j = 0; j < 5; j++) {count++;if (count == 4) {break retry;}System.out.print(count + " ");}}}}
}
输出结果
1 2 3

可以发现,break retry输出的结果仍是1 2 3,continue retry,只是提前结束了一轮的循环,下一轮循环仍然会继续。大师把代码写成这样是经典,我们就不建议把代码写成这样了,可读性太差。

那addWorker这段代码到底什么意思呢?大师是用CAS无锁的方式,增加线程数,因为是CAS无锁,那就有可能增加线程数失败,此时continue 到retry标签处重试,重新尝试CAS无锁的方式增加线程数;haha,如果运气比较好,直接增加线程数成功,那就bread retry好了,继续执行其他逻辑代码。

你真的懂了么?最好把demo代码复制下来本机调试一下!欢迎留言沟通!

ThreadPoolExecutor中addWorker,continue retry和break retry是什么意思相关推荐

  1. java聊天室小程序论文_在Java项目中利用continue与break制作一个聊天室小程序

    在Java项目中利用continue与break制作一个聊天室小程序 发布时间:2020-12-08 16:03:27 来源:亿速云 阅读:98 作者:Leah 在Java项目中利用continue与 ...

  2. python中break和continue区别_Shell break和continue跳出循环详解

    使用 while.until.for.select 循环时,如果想提前结束循环(在不满足结束条件的情况下结束循环),可以使用 break 或者 continue 关键字. 在C语言.C++.C#.Py ...

  3. [转]在jQuery的each()函数中使用continue和break

    jQuery的each函数可调用选择器得到的元素集进行循环调用.这意味着,每次执行传递进来的函数时,函数中的this关键字都指向一个不同的 DOM元素(每次都是一个不同的匹配元素).而且,在每次执行函 ...

  4. Matlab中的continue、break和return语句

    Continue: 经常用在for和while语句中,continue一旦被执行,就会终止当前循环,进行下一次循环. eg, 在for 循环中: clc clear all close alli = ...

  5. python中的continue和break

    python中的continue和break 1.comntinue只会跳出当次循环 代码: count=0 while count<100:print("loop",cou ...

  6. 循环和switch语句中的continue、break

    原文:https://www.cnblogs.com/lkprof/p/3475423.html 1. 在switch语句中,"case 常量表达式"只相当于一个语句标号, 表达式 ...

  7. switch中使用continue和break

    如果你在switch中使用continue,continue生效是对于while循环 如果你在switch中使用break,break生效是对于switch. 如果在switch外使用continue ...

  8. 【笔记】python的while循环简介:使用while循环、让用户选择何时退出、使用标志、使用break退出循环、在循环中使用continue、避免无限循环

    文章目录 一.while循环简介 二.使用while循环 三.让用户选择何时退出 四.使用标志 五.使用break退出循环 六.在循环中使用continue 七.避免无限循环 一.while循环简介 ...

  9. foxmail邮件加载失败重试_java retry(重试) spring retry, guava retrying 详解

    系列说明 java retry 的一步步实现机制. java-retry 源码地址 情景导入 简单的需求 产品经理:实现一个按条件,查询用户信息的服务. 小明:好的.没问题. 代码 UserServi ...

最新文章

  1. 《算法的乐趣》----第二章算法设计基础(笔记一)
  2. Android中使用ContentProvider进行跨进程方法调用
  3. 5类6类7类网线对比_未来值得投资的6类苗木,5年内市场前景应该都不错!
  4. 管理信息系统属于计算机的什么应用领域,全国2013自考《管理系统中计算机应用》...
  5. java开发环境搭建 pdf_01搭建java web开发环境.pdf
  6. 从CUDA开始读OpenCL
  7. python网络爬虫笔记(九)
  8. js实现相册翻页,滚动,切换,轮播功能
  9. 一文教会你使用Markdown来制作一份简洁明了的求职简历
  10. 小米手机噪音测试软件,噪音分贝仪
  11. 序 - 致“正当时”
  12. Word如何快速打出公式
  13. 2020年系统架构师案例分析
  14. [Err] 1062 - Duplicate entry '111' for key 'PRIMARY'
  15. 基于图的广度优先搜索策略(耿7.11)
  16. 【Windows安装WSL】WSL中安装Ubuntu发行版,提示占位程序接收到错误数据
  17. 金融信贷存量客户运营管理
  18. html map插件,jQuery谷歌地图插件maplace.js
  19. 万维c语言作业,万维考试系统-C语言题库.doc
  20. MySQL高级篇知识点——其它数据库日志

热门文章

  1. Linux小白三天入门进阶笔记——DAY1
  2. 全面解析流式大数据实时处理技术、平台及应用
  3. 浅谈Nginx转发匹配规则
  4. [LeetCode-java实现]3. 无重复字符的最长子串
  5. 【渝粤题库】陕西师范大学209008 教师伦理学 作业
  6. 一元二次方程虚根求法java_请问怎么用C语言求一元二次方程的虚根
  7. 如何进行用户留存分析
  8. M580PLC以太网读通讯和写通讯
  9. json转换成excel在线js小工具分享【不限制大小】
  10. 20190904携程机试