线程计数器的使用

简介: 线程计数器的使用

可以使用CountDownLatch  和 CyclicBarrier

// 订单队列
Vector<P> pos;
// 派送单队列
Vector<D> dos;
// 执行回调的线程池
Excutor excutor = Excutors.newFixedThreadPool(1);
final CyclicBarrier barrier = new CyclicBarrier(2,()->{
executor.executo(()->check());
});
void check(){
    P p = pos.remove(0);
    D d = dos.remove(0);
    // 执行对账操作
    diff = check(p, d);
    // 差异写入差异库
    save(diff);
}
void checkAll(){
    // 循环查询订单库
    Thread T1 = new Thread(()->{
    while(存在未对账订单){
        // 查询订单库
        pos.add(getPOrders());
        // 等待
        barrier.await();
    }
    });
    T1.start();
    // 循环查询运单库
    Thread T2 = new Thread(()->{
      // 查询运单库
      dos.add(getDOrders());
      // 等待
      barrier.await();
    });
    T2.start();
}

总结:

CountDownLatch 和 CyclicBarrier 是 Java 并发包提供的两个非常易用的线程同步工具类,这两个工具类用法的区别在这里还是有必要再强调一下:CountDownLatch 主要用来解决一个线程等待多个线程的场景,可以类比旅游团团长要等待所有的游客到齐才能去下一个景点;而 CyclicBarrier 是一组线程之间互相等待,更像是几个驴友之间不离不弃。除此之外 CountDownLatch 的计数器是不能循环利用的,也就是说一旦计数器减到 0,再有线程调用 await(),该线程会直接通过。但 CyclicBarrier 的计数器是可以循环利用的,而且具备自动重置的功能,一旦计数器减到 0 会自动重置到你设置的初始值。除此之外,CyclicBarrier 还可以设置回调函数,可以说是功能丰富。本章的示例代码中有两处用到了线程池,你现在只需要大概了解即可,因为线程池相关的知识咱们专栏后面还会有详细介绍。另外,线程池提供了 Future 特性,我们也可以利用 Future 特性来实现线程之间的等待,这个后面我们也会详细介绍。

目录
相关文章
|
5月前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
65 2
|
4月前
|
安全 算法 Java
Java面试题:如何诊断和解决Java应用程序中的内存泄漏问题?如何实现一个线程安全的计数器?如何合理配置线程池以应对不同的业务场景?
Java面试题:如何诊断和解决Java应用程序中的内存泄漏问题?如何实现一个线程安全的计数器?如何合理配置线程池以应对不同的业务场景?
33 0
|
6月前
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
64 0
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
Java:从单线程计数器到多线程数据同步synchronized和原子类Atomic
Java:从单线程计数器到多线程数据同步synchronized和原子类Atomic
168 0
|
存储 Java C++
JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器
JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器
107 0
信号量(Semaphore)与线程计数器(CountDownLatch)
Semaphore属于共享锁,即多个线程可以同时获取,用来表示可用资源的个数,本质上是一个计数器。
信号量(Semaphore)与线程计数器(CountDownLatch)
Juc并发编程14——线程计数器CountdownLatch源码剖析(上)
线程计数器文章目录 线程计数器CountdownLatch源码剖析 1 使用计数器锁实现任务计数 2 await的源码剖析 3 countdown源码剖析CountdownLatch源码剖析
Juc并发编程14——线程计数器CountdownLatch源码剖析(上)
Juc并发编程14——线程计数器CountdownLatch源码剖析(下)
线程计数器文章目录 线程计数器CountdownLatch源码剖析 1 使用计数器锁实现任务计数 2 await的源码剖析 3 countdown源码剖析CountdownLatch源码剖析
JUC(二)JAVA线程池开启,等待全部执行完毕,配合计数器使用,List并发异常解决
JUC(二)JAVA线程池开启,等待全部执行完毕,配合计数器使用,List并发异常解决
JUC(二)JAVA线程池开启,等待全部执行完毕,配合计数器使用,List并发异常解决
使用递增计数器的线程同步工具 —— 信号量,它的原理是什么样子的?
在 JUC 中线程同步器除了 CountDownLatch 和 CycleBarrier ,还有一个叫做 Semaphore (信号量),同样是基于 AQS 实现的。下面来看看信号量的内部原理。
127 0