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

物流网站做那个好百度seo优化网站怎么做

物流网站做那个好,百度seo优化网站怎么做,招聘网站开发费用,企业门户网站建设内容JDK并发包中常用并发工具类#xff1a; CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段#xff1b; Exchanger工具类则提供了在线程间交换数据的一种手段。 等待多线程完成的CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成… JDK并发包中常用并发工具类 CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段 Exchanger工具类则提供了在线程间交换数据的一种手段。 等待多线程完成的CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成操作。 需求解析一个Excel里多个sheet的数据可以考虑使用多线程每个线程解析一个sheet里的数据等到所有的sheet都解析完之后程序需要提示解析完成。 实现主线程等待所有线程完成sheet的解析操作最简单的做法是使用join()方法 public class JoinCountDownLatchTest {public static void main(String[] args) throws InterruptedException {Thread parser1 new Thread(() - {});Thread parser2 new Thread(() - System.out.println(parser2 finish));parser1.start();parser2.start();parser1.join();parser2.join();System.out.println(all parser finish);} }join用于让当前执行线程等待join线程执行结束。实现原理是不停检查join线程是否存活如果join线程存活则让当前线程永远等待。其中wait0表示永远等待下去。代码片段如下 while (isAlive()) {wait(0);}直到join线程中止后线程的this.notifyAll()方法会被调用调用notifyAll()方法是在JVM里实现的在JDK里看不到。 CountDownLatch也可以实现join的功能并且比join的功能更多。 public class CountDownLatchTest {static CountDownLatch c new CountDownLatch(2);public static void main(String[] args) throws InterruptedException {new Thread(() - {System.out.println(1);c.countDown();System.out.println(2);c.countDown();}).start();c.await();System.out.println(3);} }CountDownLatch的构造函数接收一个int类型的参数作为计数器等待N个点完成这里就传入N。 调用CountDownLatch的countDown方法时N就会减1CountDownLatch的await方法会阻塞当前线程直到N变成零。 countDown方法可以用在任何地方N个点可以是N个线程也可以是1个线程里的N个执行步骤。用在多个线程时只需要把这个CountDownLatch的引用传递到线程里即可。 如果有某个解析sheet的线程处理得比较慢不可能让主线程一直等待可以使用另外一个带指定时间的await方法——awaitlong timeTimeUnit unit这个方法等待特定时间后就会不再阻塞当前线程。join也有类似的方法。 同步屏障CyclicBarrier 让一组线程到达一个屏障也可以叫同步点时被阻塞直到最后一个线程到达屏障时屏障才会开门所有被屏障拦截的线程才会继续运行。 默认的构造方法是CyclicBarrierint parties其参数表示屏障拦截的线程数量每个线程调用await方法告诉CyclicBarrier我已经到达了屏障然后当前线程被阻塞。 public class CyclicBarrierTest {static CyclicBarrier c new CyclicBarrier(2);public static void main(String[] args) {new Thread(() - {try {c.await();} catch (Exception e) {}System.out.println(1);}).start();try {c.await();} catch (Exception e) {}System.out.println(2);} }主线程和子线程的调度是由CPU决定的两个线程都有可能先执行。 输出结果可能有两种 一种是 另一种 如果把new CyclicBarrier(2)修改成new CyclicBarrier(3)主线程和子线程会永远等待因为没有第三个线程执行await方法即没有第三个线程到达屏障所以之前到达屏障的两个线程都不会继续执行。 更高级的构造函数CyclicBarrierint partiesRunnable barrierAction用于在线程到达屏障时优先执行barrierAction方便处理更复杂的业务场景。 public class CyclicBarrierTest2 {static CyclicBarrier c new CyclicBarrier(2, new A());public static void main(String[] args) {new Thread(() - {try {c.await();} catch (Exception e) {}System.out.println(1);}).start();try {c.await();} catch (Exception e) {}System.out.println(2);}static class A implements Runnable {Overridepublic void run() {System.out.println(3);}} }初始值设为2等代码中的第一个线程和线程A都执行完之后才会继续执行主线程然后输出2。结果一定是 CyclicBarrier的应用场景 CyclicBarrier可以用于多线程计算数据最后合并计算结果的场景。 public class BankWaterService implements Runnable {/*** 创建4个屏障处理完之后执行当前类的run方法*/private CyclicBarrier c new CyclicBarrier(4, this);/*** 假设只有4个sheet只启动4个线程*/private final Executor executor Executors.newFixedThreadPool(4);/*** 保存每个sheet计算出的银流结果*/private final ConcurrentHashMapString, Integer sheetBankWaterCount newConcurrentHashMap();private void count() {for (int i 0; i 4; i) {executor.execute(() - {// 计算当前sheet的银流数据计算代码省略sheetBankWaterCount.put(Thread.currentThread().getName(), 1);// 银流计算完成插入一个屏障try {c.await();} catch (InterruptedException |BrokenBarrierException e) {e.printStackTrace();}});}}Overridepublic void run() {int result 0;// 汇总每个sheet计算出的结果for (Map.EntryString, Integer sheet : sheetBankWaterCount.entrySet()) {result sheet.getValue();}// 将结果输出sheetBankWaterCount.put(result, result);System.out.println(result);}public static void main(String[] args) {BankWaterService bankWaterCount new BankWaterService();bankWaterCount.count();} }计算银行流水一个sheet开启一个线程所有线程执行完毕将所有计算结果相加得银行总流水。 最后输出结果为4。 CyclicBarrier和CountDownLatch的区别 CountDownLatch的计数器只能使用一次而CyclicBarrier的计数器可以使用reset()方法重置。CyclicBarrier能处理更为复杂的业务场景。例如如果计算发生错误可以重置计数器并让线程重新执行一次。 CyclicBarrier还提供其他有用的方法比如getNumberWaiting方法可以获得CyclicBarrier阻塞的线程数量。isBroken()方法用来了解阻塞的线程是否被中断。 控制并发线程数的Semaphore Semaphore信号量是用来控制同时访问特定资源的线程数量它通过协调各个线程以保证合理的使用公共资源。 应用场景 Semaphore可以用于做流量控制特别是公用资源有限的应用场景比如数据库连接。 需求要读取几万个文件的数据因为都是IO密集型任务可以启动几十个线程并发地读取但是如果读到内存后还需要存储到数据库中而数据库的连接数只有10个这时必须控制只有10个线程同时获取数据库连接保存数据否则会报错无法获取数据库连接。此时就使用Semaphore来做流量控制。 public class SemaphoreTest {private static final int THREAD_COUNT 30;private static final ExecutorService threadPool Executors.newFixedThreadPool(THREAD_COUNT);private static final Semaphore s new Semaphore(10);public static void main(String[] args) {for (int i 0; i THREAD_COUNT; i) {threadPool.execute(() - {try {s.acquire();System.out.println(save data);s.release();} catch (InterruptedException e) {}});}threadPool.shutdown();} }有30个线程在执行但是只允许10个并发执行。 构造方法Semaphoreint permits接受一个整型的数字表示可用的许可证数量。Semaphore10表示允许10个线程获取许可证也就是最大并发数是10。Semaphore的用法也很简单首先线程使用Semaphore的acquire()方法获取一个许可证使用完之后调用release()方法归还许可证。还可以用tryAcquire()方法尝试获取许可证。 一些其他方法 线程间交换数据的Exchanger Exchanger交换者是一个用于线程间协作的工具类。 用于进行线程间的数据交换。它提供一个同步点在这个同步点两个线程可以交换彼此的数据。 两个线程通过exchange方法交换数据如果第一个线程先执行exchange()方法它会一直等待第二个线程也执行exchange方法当两个线程都到达同步点时这两个线程就可以交换数据将本线程生产出来的数据传递给对方。 Exchanger可以用于遗传算法。遗传算法里需要选出两个人作为交配对象这时候会交换两人的数据并使用交叉规则得出2个交配结果。 Exchanger也可以用于校对工作。 需求将纸制银行流水通过人工的方式录入成电子银行流水为了避免错误采用AB岗两人进行录入录入到Excel之后系统需要加载这两个Excel并对两个Excel数据进行校对看看是否录入一致。 两个线程间数据传递。 public class ExchangerTest {private static final ExchangerString exgr new Exchanger();private static final ExecutorService threadPool Executors.newFixedThreadPool(2);public static void main(String[] args) {threadPool.execute(() - {try {// A录入银行流水数据String A 银行流水A;String B exgr.exchange(A);System.out.println(B----- B);} catch (InterruptedException e) {}});threadPool.execute(() - {try {// B录入银行流水数据String B 银行流水B;String A exgr.exchange(B);System.out.println(A和B数据是否一致 A.equals(B) A录入的是 A B录入是 B);} catch (InterruptedException e) {}});threadPool.shutdown();} }输出结果 如果两个线程有一个没有执行exchange()方法则会一直等待避免一直等待可以使用exchangeV xlongtimeoutTimeUnit unit设置最大等待时长。
http://www.pierceye.com/news/469224/

相关文章:

  • 网站seo工作内容大学做视频网站
  • 台州网站建设企业网站 微信开发
  • 安徽省水利厅网站 基本建设营销策划公司名称
  • 网页设计师培训学院开封做网站优化
  • 山西电力建设三公司网站影院禁止18岁以下观众观影
  • 防伪网站模板网站开发怎么赚钱
  • 医院网站建设意义推广咨询
  • 广东省54个市win10最强优化软件
  • 交换链接网站asp.net企业网站框架
  • 惠州网站建设制作推广医疗设备响应式网站
  • 有哪些做ppt的网站cms网站开发涉及的知识
  • 软件开发成本估算表苏州百度seo代理
  • 网站内部链接有什么作用临安做企业网站的公司
  • 整合营销网站网站建设销售话术开场白
  • 永久免费wap自助建站北京家装设计师排名
  • 西安学校网站建设报价做淘宝客没有网站怎么做
  • 网站建设运营思路网站已在别处备案怎么转入阿里云
  • 网站开发前端如何开发秦皇岛做网站
  • sns网站建设最好看免费观看高清大全宫崎骏
  • 手机网站开发下载app开发长沙
  • 重庆南川网站制作价格西宁网站建设优化
  • 电子商务网站建设与管理试卷6平面设计接单兼职
  • 建设手机网站大概要多少钱云南建投二公司官网
  • 公司如何建设网站首页网页设计与网站开发试题答案
  • 中企动力合作网站网站app下载平台怎么做
  • 网站开发专业成功人士重庆邮电大学官网网站
  • 官方网站后台图片下载怎么做网站开发与支付宝端口连接
  • 浏览器怎么打开网站服务器下载在线音乐网站开发摘要
  • 建网站拿到广告吉林整站优化
  • 怎么建站网站清远佛冈住房和城乡建设局网站