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

网站版块下载腾讯企业邮箱注册申请官网

网站版块下载,腾讯企业邮箱注册申请官网,衡水做外贸网站建设,外贸流程有哪些AQS系列 1、AQS核心原理 2、ReentrantLock 原理及示例 3、CountDownLatch / Semaphore 示例及使用场景 4、BlockingQueue 示例及使用场景 5、静态代码块中使用 ExecutorService 执行多线程会出现什么情况呢#xff1f; 文章目录 AQS系列一、 一般场景二、static {} 场景三、原…AQS系列 1、AQS核心原理 2、ReentrantLock 原理及示例 3、CountDownLatch / Semaphore 示例及使用场景 4、BlockingQueue 示例及使用场景 5、静态代码块中使用 ExecutorService 执行多线程会出现什么情况呢 文章目录 AQS系列一、 一般场景二、static {} 场景三、原理why? 一、 一般场景 我们在 MultiThreadExample.java 中 编写一个 exec 方法这个方法中通过 Executors.newFixedThreadPool(3) 初始化一个线程池线程数量是 3随后则提交三个任务最后用 executorService.shutdown() 关闭线程池再用 awaitTermination 方法来等待所有的线程执行完exec 方法运行结束了。 那一般我们是在 main 方法中直接调用 exec() 方法来执行代码如下 public class MultiThreadExample {public static void main(String[] args) {exec();}private static void exec(){System.out.println(任务开始执行...);// 创建一个固定大小的线程池其中包含3个线程ExecutorService executorService Executors.newFixedThreadPool(3);// 启动任务1executorService.execute(() - {for (int i 1; i 5; i) {System.out.println(任务1 - 执行步骤 i);}});// 启动任务2executorService.execute(() - {for (int i 1; i 5; i) {System.out.println(任务2 - 执行步骤 i);}});// 启动任务3executorService.execute(() - {for (int i 1; i 5; i) {System.out.println(任务3 - 执行步骤 i);}});// 关闭线程池executorService.shutdown();try {// 等待所有任务执行完毕或者超时这里设置超时为10秒if (!executorService.awaitTermination(10, TimeUnit.SECONDS)) {// 如果在超时时间内任务没有执行完毕可以选择进行额外处理System.out.println(等待超时可能有任务未完成);}} catch (InterruptedException e) {e.printStackTrace();}System.out.println(所有任务已经完成程序退出。);} }运行结果 任务开始执行... 任务1 - 执行步骤 1 任务1 - 执行步骤 2 任务1 - 执行步骤 3 任务1 - 执行步骤 4 任务1 - 执行步骤 5 任务2 - 执行步骤 1 任务2 - 执行步骤 2 任务2 - 执行步骤 3 任务2 - 执行步骤 4 任务2 - 执行步骤 5 任务3 - 执行步骤 1 任务3 - 执行步骤 2 任务3 - 执行步骤 3 任务3 - 执行步骤 4 任务3 - 执行步骤 5 所有任务已经完成程序退出...二、static {} 场景 其实和一般场景最大的区别就是exec() 方法是在静态代码块中被调用的也就是在 类加载 时就被执行的。 public class MultiThreadExample {static {exec();}public static void main(String[] args) {// 这里不管是否 new 效果都一样的new MultiThreadExample();}private static void exec(){System.out.println(任务开始执行...);// 创建一个固定大小的线程池其中包含3个线程ExecutorService executorService Executors.newFixedThreadPool(3);// 启动任务1executorService.execute(() - {for (int i 1; i 5; i) {System.out.println(任务1 - 执行步骤 i);}});// 启动任务2executorService.execute(() - {for (int i 1; i 5; i) {System.out.println(任务2 - 执行步骤 i);}});// 启动任务3executorService.execute(() - {for (int i 1; i 5; i) {System.out.println(任务3 - 执行步骤 i);}});// 关闭线程池executorService.shutdown();try {// 等待所有任务执行完毕或者超时这里设置超时为10秒if (!executorService.awaitTermination(10, TimeUnit.SECONDS)) {// 如果在超时时间内任务没有执行完毕可以选择进行额外处理System.out.println(等待超时可能有任务未完成);}} catch (InterruptedException e) {e.printStackTrace();}System.out.println(所有任务已经完成程序退出。);} }运行结果 任务开始执行... 等待超时可能有任务未完成 所有任务已经完成程序退出... 任务3 - 执行步骤 1 任务2 - 执行步骤 1 任务2 - 执行步骤 2 任务2 - 执行步骤 3 任务2 - 执行步骤 4 任务2 - 执行步骤 5 任务3 - 执行步骤 2 任务3 - 执行步骤 3 任务3 - 执行步骤 4 任务3 - 执行步骤 5 任务1 - 执行步骤 1 任务1 - 执行步骤 2 任务1 - 执行步骤 3 任务1 - 执行步骤 4 任务1 - 执行步骤 5三、原理why? 我们可以看到 一般场景 和 static {} 场景 的运行结果完全不同static {} 场景 则出现了等待超时的情况而不是等待所有线程都运行结束这是为什么呢 我们知道 static{} 是一个静态代码块当 JVM 加载 MultiThreadExample 类时会自动调用静态块中的 exec() 方法这意味着线程池和线程会在 main() 方法之前就开始执行了那为什么在 static{} 中调用 exec() 方法时会出现等待超时的情况呢 出现 等待超时可能是有任务未完成的情况是因为主线程在调用 executorService.shutdown() 后立即尝试通过 executorService.awaitTermination(10, TimeUnit.SECONDS) 来等待所有任务完成但此时由于线程池中的线程尚未完全启动或正在执行中所以主线程可能在给定的超时时间内无法确认所有任务是否已完成从而导致超时。 那为什么在 main() 方法中调用 exec() 方法就不超时所有线程都按预期执行完成在 static{} 静态代码块中执行就会超时呢 我们在 execute(() -{}提交了任务之后使用了 shutdown() 方法来关闭线程池然后立即通过 awaitTermination(10, TimeUnit.SECONDS) 来等待所有线程都完成但是此时线程池中的线程并没有开始执行或者正在执行中而我们到 awaitTermination 方法中打断点会看到程序执行到了 nanos termination.awaitNanos(nanos); 这句如图 为啥执行到了这句因为上面的 runStateAtLeast(ctl.get(), TERMINATED) 判断返回了 falserunStateAtLeast 方法源码如下 private static boolean runStateAtLeast(int c, int s) { return c s; }说明线程池中的线程并没有执行完c 是线程池中的目前的线程数量s 是线程池中总的线程数量看调用处传参就知道传入的参数是 ctl.get() 和 TERMINATED。 termination.awaitNanos(nanos) 等待完之后又赋值给 nanos此时 nanos 的值是一个负数了因为此方法中经过了 LockSupport.parkNanos(this, nanosTimeout); 等待之后返回是这样返回的 return deadline - System.nanoTime() 所以在 for 无线循环中等待完 nanos 时间后下次循环时 nanos 时小于 0 的则返回了 false。 那为什么线程池中的线程没有执行完呢还需深究此时先知道大概原因后面待更新 码友们中的大佬也可以解释下更底层原因欢迎评论区留言讨论。
http://www.zqtcl.cn/news/663218/

相关文章:

  • 丹阳网站建设案例自己做个网站怎么赚钱
  • 净水机企业网站源码浏览器下载安装2022最新版
  • 高端网站建设四川网页版微信怎么下载
  • 青岛做网站皆赴青岛博采wordpress怎么改密码忘记
  • 深圳最好的网站建设广西论坛网站建设
  • html5网站设计网站建设 广西
  • 顺德手机网站设计价位网站开发学习流程图
  • 班级网站设计合肥蜀山网站开发
  • 杭州网站建设培训ck播放器整合WordPress
  • 网站建设是什么软件品牌策划公司哪家好推荐
  • 网站转跳怎么做餐饮vi设计
  • 刘连康seo培训哪家强网站优化推广平台
  • 网站推广内容滁州做网站的
  • 黄山做网站公司山东省住房和城乡建设厅举报电话
  • 中医科网站建设素材上海文明城市建设网站
  • html课程教学网站模板手机微信小程序开发教程
  • 用电脑做兼职的网站比较好食品网站建设网站定制开发
  • 网站开发 加密保护小程序制作开发进度表
  • 深圳坪山站外贸展示型网站建设
  • 手机端自定义做链接网站济南网站制作方案
  • 软件网站是怎么做的帮别人做网站赚多少钱
  • 纯静态网站 搜索功能佛山网站建设 奇锐科技
  • 四川省建设厅官方网站联系电话自己网站做虚拟币违法吗
  • 同城招聘网站自助建站2014 网站建设
  • 个人网站空间大小江油官方网站建设
  • 怎样建网站做什么网站能吸引流量
  • 做vi设计的网站网络营销推广思路
  • 简述网站设计流程沁水做网站
  • 南京公司网站建设怎么收费获奖网页设计
  • 网站域名试用期水墨风格网站源码