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

网站的建设与板块一站式营销型网站建设服务

网站的建设与板块,一站式营销型网站建设服务,上海著名网站设计公司,dw网页制作在线编辑本文介绍两种BlockingDeque在多线程任务处理时正确结束的方法 一般最开始简单的多线程处理任务过程 把总任务放入BlockingDeque创建多个线程#xff0c;每个线程内逻辑时#xff0c;判断BlockingDeque任务是否处理完#xff0c;处理完退出#xff0c;还有任务就BlockingDe…本文介绍两种BlockingDeque在多线程任务处理时正确结束的方法 一般最开始简单的多线程处理任务过程 把总任务放入BlockingDeque创建多个线程每个线程内逻辑时判断BlockingDeque任务是否处理完处理完退出还有任务就BlockingDeque.take()取任务处理主线程join等待多线程处理完收尾处理完成任务。 最开始版本代码10个任务3个线程来处理 package org.example;import java.util.ArrayList; import java.util.List; import java.util.concurrent.BlockingDeque; import java.util.concurrent.LinkedBlockingDeque;public class Main3 {public static void main(String[] args){System.out.println(start);BlockingDequeInteger task new LinkedBlockingDeque();for (int i 0; i 10; i) {task.add(i);}ListThread workers new ArrayList();for (int i 0; i 3; i) {Thread worker new Thread(()-{while (true) {Integer data null;try {if (task.size()0) {System.out.println(Thread.currentThread().getName() quit);break;} // Thread.sleep(100); // 默认任务耗时data task.take();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(Thread.currentThread().getName() do data);}});workers.add(worker);worker.start();}for (Thread worker: workers) {try {worker.join();} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println(job done);} }运行之后感觉非常好完美实现逻辑 但是当把上面的任务数加到200线程数加到30上面线程sleep的注释打开再次运行就会发现主进程最后会被一直卡着不结束说明多线程没有正确判断任务结束线程不安全 上面的子线程内的size()等于0到下面的BlockingDeque.take()取任务这段之间的代码这段不是线程安全的 让线程正确判断任务结束而且要线程安全的三种方法推荐第二种兼顾效率和兼容正确性 判断任务结束这段代码加synchronized约束起来实现线程安全太慢给总任务task内加入和线程相同数量的停止标志marker使用BlockingDeque.poll(超时时间) 异常数据检查需要检查异常数据 使用synchronized约束 package org.example;import java.util.ArrayList; import java.util.List; import java.util.concurrent.BlockingDeque; import java.util.concurrent.LinkedBlockingDeque;public class Main {public static void main(String[] args) {System.out.println(start);BlockingDequeInteger task new LinkedBlockingDeque();for (int i 0; i 20; i) {task.add(i);}ListThread workers new ArrayList();for (int i 0; i 3; i) {Thread worker new Thread(()-{while (true) {Integer data null;synchronized (task) {if (task.size() 0) {System.out.println(Thread.currentThread().getName() quit);break;}try {data task.take();} catch (InterruptedException e) {throw new RuntimeException(e);}}try {Thread.sleep(300);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(Thread.currentThread().getName() do data);}});workers.add(worker);worker.start();}for (Thread worker: workers) {try {worker.join();} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println(job done);} }总任务添加stop marker停止标志 package org.example;import java.util.ArrayList; import java.util.List; import java.util.concurrent.BlockingDeque; import java.util.concurrent.LinkedBlockingDeque;public class Main2 {public static void main(String[] args){System.out.println(start);BlockingDequeInteger task new LinkedBlockingDeque();for (int i 0; i 20; i) {task.add(i);}ListThread workers new ArrayList();for (int i 0; i 3; i) task.add(99);for (int i 0; i 3; i) {Thread worker new Thread(()-{while (true) {Integer data null;try {data task.take();if (data 99) {System.out.println(Thread.currentThread().getName() quit);break;}} catch (InterruptedException e) {throw new RuntimeException(e);}try {Thread.sleep(300);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(Thread.currentThread().getName() do data);}});workers.add(worker);worker.start();}for (Thread worker: workers) {try {worker.join();} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println(job done);} }使用BlockingDeque.poll(超时时间)避免了take的永久性等待问题但是会取到null值要加判断处理 package org.example;import java.util.ArrayList; import java.util.List; import java.util.concurrent.BlockingDeque; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.TimeUnit;public class Main4 {public static void main(String[] args){System.out.println(start);BlockingDequeInteger task new LinkedBlockingDeque();for (int i 0; i 200; i) {task.add(i);}ListThread workers new ArrayList();for (int i 0; i 30; i) {Thread worker new Thread(()-{while (true) {Integer data null;try {if (task.size()0) {System.out.println(Thread.currentThread().getName() quit);break;}Thread.sleep(100); // 默认任务耗时data task.poll(1000, TimeUnit.MILLISECONDS);if (data null) {System.out.println(Thread.currentThread().getName() get null);continue;}} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(Thread.currentThread().getName() do data);}});workers.add(worker);worker.start();}for (Thread worker: workers) {try {worker.join();} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println(job done);} }
http://www.hkea.cn/news/14536146/

相关文章:

  • jsp酒店预订网站开发电脑访问手机网站跳转
  • 云南省城乡建设培训中心网站平面设计免费素材网站
  • 网站关键词快速排名软件微网站的制作过程
  • 重庆网站建设小能手视频网站 flash h5
  • 新民电商网站建设价格咨询网页版淘宝登录入口
  • 营销型网站主页定制ps制作网页步骤
  • seo如何分析网站wordpress不同栏目使用不同模板
  • 做壁画的网站建立网站时要采用一定的链接结构可采用的基本方式有
  • 网站建设管理经验做法线上营销策略
  • 重庆网站制作设计公司网站建设费用摊销多少年
  • 强大的网站设计制作网站建设主要业务流程设定
  • 吕梁做网站的公司安徽网站建设哪家好
  • 网络网站建设价格广安市邻水建设局网站
  • 玉树营销网站建设网站虚拟空间过期
  • 网站制作公司 沧州网站开发及代运营
  • 上海千樱网站建设同城版网站建设
  • 哪里做网站比较稳定哪个网站教做ppt模板
  • python 做网站 数据库网站备案 地域
  • 推广普通话的广告语网站优化要怎么做才会做到最佳
  • 普洱市网站建设网页认证
  • 深圳定做网站泉州网官网
  • 网站开发维护印花税营销网站建设网站开发
  • php企业网站开发好学么哪个网站百度收录快
  • 给蛋糕店做企业网站的文案红色大气网站
  • 有无专门做网站会员人数迅速增加的方法acg的wordpress主题
  • 深圳做网站建设开发数据库网页制作教程
  • 网站多语言解决方案教做美食的视频网站
  • 金华网站建设luopan学平面设计哪个学校好
  • 青岛网站推广企业南京做企业网站
  • 网站怎么修改模板内容seo百度关键词优化软件