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

惠州建设网站石景山高端网站建设

惠州建设网站,石景山高端网站建设,浙江住房和城乡建设厅网站首页,两个网站 一个域名文章目录 1. 定义2. 实现保护性暂停模式3. Join原理4. 保护性暂停模式的扩展 1. 定义 即Guarded Suspension#xff0c;用在一个线程等待另一个线程的执行结果。 有一个结果需要从一个线程传递给另一个线程#xff0c;让他们关联到同一个GuarderObject#xff08;这就是保… 文章目录 1. 定义2. 实现保护性暂停模式3. Join原理4. 保护性暂停模式的扩展 1. 定义 即Guarded Suspension用在一个线程等待另一个线程的执行结果。 有一个结果需要从一个线程传递给另一个线程让他们关联到同一个GuarderObject这就是保护性暂停模式是两个线程之间交换结果的模式如果有结果不断从一个线程到另一个线程可以使用消息队列这个是生产者-消费者模式JDK中Join实现Futrue的实现采用的就是此模式因为要等待另一方的结果因此归类到同步模式 2. 实现保护性暂停模式 实现这个模式的关键是GuardedObjectresponse属性是用来保存中间结果。所以我们使用wait-notify来实现保护性暂停模式。 实现保护对象 class GuardedObject{private Object response;//获取结果public Object get() {synchronized (this){while(responsenull){try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}return response;}}public void complete(Object response){synchronized (this){this.responseresponse;this.notify();}} }案例场景线程1等待线程二的下载结果 public class jvm {public static ListString downLoad() throws IOException {HttpURLConnection connection (HttpURLConnection) new URL(https://www.baidu.com/).openConnection();ListString listnew ArrayList();try(BufferedReader readernew BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))){String line;while((line reader.readLine())!null){list.add(line);}}return list;}public static void main(String[] args) {GuardedObject guardedObjectnew GuardedObject();new Thread(()-{log.debug(等待结果);ListString list (ListString) guardedObject.get();log.debug(结果大小,[{}],list.size());},线程1).start();new Thread(()-{log.debug(执行下载);try {ListString listdownLoad();guardedObject.complete(list);} catch (IOException e) {e.printStackTrace();}},线程2).start();} }3. Join原理 Join底层原理就是基于这种保护性暂停的模式首先我们来看看Join的底层源码 public final synchronized void join(long millis)throws InterruptedException {//获得系统当前的时间戳long base System.currentTimeMillis();//定义当前时间戳为0long now 0;if (millis 0) {throw new IllegalArgumentException(timeout value is negative);}//如果传入的等待时间为0if (millis 0) {//如果线程是存活的就一直等待调用wait(0)while (isAlive()) {wait(0);}} else {while (isAlive()) {long delay millis - now;if (delay 0) {break;}wait(delay);now System.currentTimeMillis() - base;}}}public final synchronized void join(long millis, int nanos)throws InterruptedException {if (millis 0) {throw new IllegalArgumentException(timeout value is negative);}if (nanos 0 || nanos 999999) {throw new IllegalArgumentException(nanosecond timeout value out of range);}if (nanos 500000 || (nanos ! 0 millis 0)) {millis;}join(millis);}public final void join() throws InterruptedException {join(0);}从源码可以看出join的底层就是使用wait机制实现的。 4. 保护性暂停模式的扩展 途中Futures就好比居民楼的一层信箱每个信箱都有自己的编号左侧的t0t2t4就好比等待邮件的居民等待结果的线程右侧t1t3t5就好比邮递员。如果需要在多个类之间使用GuardedObject对象作为参数传递不是很方便因此设计一个用来解耦的中间类这样不仅仅能够解藕结果等待者和结果生产者还能支持多个任务的管理。 改造GuardedObject类 class GuardedObject{private Object response;private int id;public GuardedObject(){}public GuardedObject(int id){this.idid;}public int getId(){return id;}//获取结果public Object get() {synchronized (this){while(responsenull){try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}return response;}}public void complete(Object response){synchronized (this){this.responseresponse;this.notify();}} }构造解耦类 class Boxes{private static MapInteger,GuardedObject boxnew ConcurrentHashMap();//产生一个唯一的idpublic static int id1;private static synchronized int increment(){return id;}public static GuardedObject getGuardedObject(int id){return box.remove(id);}public static GuardedObject creatGuardedObject(){GuardedObject guardedObjectnew GuardedObject(increment());box.put(guardedObject.getId(),guardedObject);return guardedObject;}public static SetInteger getIds(){return box.keySet();}}创造等待线程和生产线程 Slf4j class PostMan extends Thread{private int id;private String mail_contex;//邮递员创建信件public PostMan(int id,String mail_contex){this.idid;this.mail_contexmail_contex;}Overridepublic void run(){GuardedObject guardedObjectBoxes.getGuardedObject(id);log.debug(送信-{},内容-{},id,mail_contex);guardedObject.complete(mail_contex);} } class Boxes{private static MapInteger,GuardedObject boxnew Hashtable();//产生一个唯一的idpublic static int id1;private static synchronized int increment(){return id;}public static GuardedObject getGuardedObject(int id){return box.remove(id);}public static GuardedObject creatGuardedObject(){GuardedObject guardedObjectnew GuardedObject(increment());box.put(guardedObject.getId(),guardedObject);return guardedObject;}public static SetInteger getIds(){return box.keySet();}}测试 public class jvm {public static void main(String[] args) throws InterruptedException {for (int i 0; i 3; i) {new Poeple().start();}Thread.sleep(1000);for (Integer id : Boxes.getIds()) {new PostMan(id, 内容 id).start();}} }
http://www.pierceye.com/news/653845/

相关文章:

  • 北京优化词网站晋城企业网站建设
  • 商城网站 个人备案建设工程质量监理协会网站
  • 易企cms网站模板广告设计与制作好找工作吗
  • wordpress建站容易吗食品饮料网站源码
  • 做网站还有市场吗建一个网站花费
  • 惠州网站建设哪里有wap网站生成
  • 长沙网站外包公司吗搭建wordpress博客系统
  • 通州企业网站建设做网站合成APP
  • 深圳观澜网站建设室内设计软件手机版
  • 苏州建设网站服务国外做家装的网站有哪些
  • 做导航网站赚钱吗大兴区营销网络推广行业
  • 红衫中国网站建设福建手机版建站系统开发
  • 做平面的网站wordpress授权主题
  • 如何做织梦论坛类的网站官网建设目的
  • 安徽网新科技有限公司 网站开发静态网页报告
  • 营销做网站公司怎么做国际货运代理外贸网站
  • 网站建设部署与发布有效期宝石网站建设
  • 网站建设有什么需求分析现在网站都是拿什么软件做的
  • 网站建设需求分析报告撰写阿里云建设网站流程
  • 网站导航栏设计要求seo搜索引擎的优化
  • 杭州做商务网站全屋定制自己设计
  • 汉中定制网站建设公司南昌公司注册
  • 商务网站建设流程步骤小型公司注册资金写多少合适
  • 台州公司网站外包自己做网站运营
  • 聚名网站专业团队p图
  • 网站推广排名收费徐家汇网站建设
  • 做app软件大概多少钱宁波seo优化项目
  • 网站建设土豆视频教程最专业微网站首选公司
  • 合肥做检查军大网站家装公司名称
  • 网站搜索怎么做的苏州网站建设介绍