多线程并发工具类

分而治之与动态规划

       分而治之:一个大问题分割为相同的小问题,而小问题之间无关联。

       动态规划:一个大问题分割为相同的小问题,但是小问题之间有关联。

十大计算机经典算法

        快速排序、归并排序、二分查找属于分而治之,堆排序、线性查找、深度优先、广度优先、DijkStra、动态规划、朴素贝叶斯分类。

Fork/Join

        使用下面一张图解释forkJoin。


        jorkjoin的提交方式与返回值:如果使用同步的方式就用invoke提交,如果使用异步的方式就用submit或者exectrue方式提交。RecursiveTask<V>有返回值,RecursiveAction没有返回值。

countdownluch、CyclicBarrier、Semaphore、 Exchange

        CyclicBarrier:await()可以重复执行,同时也可以有汇总runnable线程。而countDownLuch计数器则不同,计数器和线程数无关,cyclicBarrier计数器必须和线程数相同。Cyclicbarrier多用于多线程计算数据,然后汇总合并结果的场景下。而countdownluch我们平常使用的比较多。

        Semaphore:做的是流控使用。调用acquire()先拿到许可证,然后才能做业务工作。最后调用release()再把相关链接放回去供其他线程来使用。相关的业务如实现数据库连接池。

        Semaphore注意事项:使用时要定义两个semaphore,否则调用release()归还连接时可能会造成控制不住的情况。如归还的数据库连接是自己新创建的链接。

        Exchange:两个线程在执行,线程a和b在执行,a先执行了,然后调用了exchange,线程a就会等着线程b执行完,然后两个线程进行数据交换。然后两个线程继续执行。只能用于两个线程之间的数据交换。

Callable、Future和FutureTask

      Callable是带线程的返回值。通过FutureTask的构造函数包装Callable,最后执行new Thread(futureTask).start();启动线程。然后使用FutureTask.get()得到返回值。如果想要中止线程则使用futureTask.cancel()终止线程。注意:中止线程也只是记录标记位,需要自己根据标记位实现终止线程(使用isInterrupt()方法实现)。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。