分而治之与动态规划
分而治之:一个大问题分割为相同的小问题,而小问题之间无关联。
动态规划:一个大问题分割为相同的小问题,但是小问题之间有关联。
十大计算机经典算法
快速排序、归并排序、二分查找属于分而治之,堆排序、线性查找、深度优先、广度优先、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()方法实现)。