• espipe并发编程应用


    首先给各位股东报告个好消息,原本上个月发布的版本0.0.4-SNAPSHOT延误了一个月,今天终于完工了,正式开启0.0.5-SNAPSHOT。

    espipe-core有三大目标:

    1. 解决数据同步格式问题

    2. 解决数据同步性能问题

    3. 解决多环境维护不方便问题

    像同步数据这种长时间的任务,使用多线程来做性能优化,可以说是首选。

    多线程的中心思想就是分工,协作,互斥

    01 espipe多线程应用

    分工:采用Thread per message模式, 一个index的init或者sync作为一个线程,采用线程池管理Thread的生命周期。

    协作:目前各线程之前不需要同步信息。

    互斥:同一个index在同一时间内只能有一个init或者sync线程,不允许重复;否则index mapping可能会错误的设置为默认字段类型,

    采用ConcurrentHashMap来管理每个线程,自带分段锁。

    异常处理:ThreadPoolExecutor execute 子线程内抛出的异常无法在主线程内捕获,采用Thread.UncaughtExceptionHandler,以log的形式暂时先保存错误信息。

    ThreadPoolExecutor submit 可以通过Future.get()直接在主线程内try catch异常。

    优雅退出:直接在stop方法上加上@PreDestroy

    其他补充

    异常处理:继承ThreadPoolExecutor,重写afterExecute方法来处理异常。

    优雅退出

    // 方法1SpringApplication application =   new SpringApplication(Application.class);application.addListeners((ApplicationListener) event -> {  log.info("Graceful Shutdown");});application.run(args);// 方法2Thread hook = new Thread(() ->   System.out.println("Graceful shutdown"));Runtime.getRuntime().addShutdownHook(hook);

    02 聊聊Java

    并发编程不是java的特性,并发模型可以通过管程或者信号量来实现。

    管程是一种解决并发问题的通用模型,能解决线程协作,互斥问题。

    在1974年和1977年,Hore和Hansen提出了管程。

    在1965年,荷兰学者Dijkstra提出的信号量(Semaphores)机制。

    Java中管程的实现就是synchronized,javap反编译后你就可以看到synchronized关键字被编译成为monitorenter和monitorexit,这个monitor经常被翻译成为监视器或者管程。

    所谓分工指的是如何高效地拆解任务并分配给线程,

    而同步指的是线程之间如何协作,

    互斥则是保证同一时刻只允许一个线程访问共享资源。

    按照这三个类别来看Java并发包就简单了。

    分工:

    线程池Executor, Fork/Join, Future

    同步,协作:

    sychronized, lock & condition

    CountDownLatch, CyclicBarrier, Semaphore

    互斥

    无锁: Immutable, ThreadLocal. CAS, CopyOnWrite, AtomicInteger

    有锁: synchronized, Lock, ReadWriteLock

    同步和互斥大佬都已经在JDK里包办了,就剩个分工可以玩出点花样:

    Guarded Syspension模式,Balking模式,Thread-Per-Message模式,生产者消费者模式,Work-Thread模式,两阶段终止模式。

    看书写demo,只能浅尝一下,实战还得来真实相中,下载espipe,来次真实的体验。

    关注公众号nooshhub,看最新的更新。

     

  • 相关阅读:
    【Vue五分钟】 五分钟了解Webpack底层原理以及脚手架工具分析
    基于vue3的京东nutui组件库的表单校验规则:怎样进行表单验证?怎样只使用指定的某一个规则进行校验呢?
    Postman常用断言功能解析
    XML简单介绍
    威尔士和英格兰同属英国,但为啥还要在世界杯上进行PK?
    通过位运算,实现单字段标识多个状态位
    【Java线程池】 java.util.concurrent.ThreadPoolExecutor 源码分析
    华为OD机试真题 Java 实现【比赛的冠亚季军】【2023 B卷 100分】,附详细解题思路
    猿创征文|十一 BLE协议之ATT
    花40天啃完这份微服务架构笔记,终于挺进腾讯T3,它太重要了
  • 原文地址:https://blog.csdn.net/shandeai520/article/details/126115058