网站怎么注册域名,备案网站公共查询,网站建设时间计划书,cms高端建站线程数超过CPU核心数是没有任何意义的【因为要使用CPU密集型运算】
Fork/Join#xff1a;线程池的实现#xff0c;体现是分治思想#xff0c;适用于能够进行任务拆分的 CPU 密集型运算#xff0c;用于并行计算
任务拆分#xff1a;将一个大任务拆分为算法上相同的小任务…
线程数超过CPU核心数是没有任何意义的【因为要使用CPU密集型运算】
Fork/Join线程池的实现体现是分治思想适用于能够进行任务拆分的 CPU 密集型运算用于并行计算
任务拆分将一个大任务拆分为算法上相同的小任务直至不能拆分可以直接求解。跟递归相关的一些计算如归并排序、斐波那契数列都可以用分治思想进行求解 Fork/Join 在分治的基础上加入了多线程把每个任务的分解和合并交给不同的线程来完成提升了运算效率 ForkJoin 使用 ForkJoinPool 来启动是一个特殊的线程池默认会创建与 CPU 核心数大小相同的线程池 任务有返回值继承 RecursiveTask没有返回值继承 RecursiveAction【特殊不能用Runnable或者Callable了】 public static void main(String[] args) {ForkJoinPool pool new ForkJoinPool(4);System.out.println(pool.invoke(new MyTask(5)));//拆分 5 MyTask(4) -- 4 MyTask(3) --}// 1~ n 之间整数的和class MyTask extends RecursiveTaskInteger {private int n;public MyTask(int n) {this.n n;}Overridepublic String toString() {return MyTask{ n n };}Overrideprotected Integer compute() {// 如果 n 已经为 1可以求得结果了if (n 1) {return n;}// 将任务进行拆分(fork)MyTask t1 new MyTask(n - 1);t1.fork(); //执行计算// 合并(join)结果int result n t1.join(); //获取上面fork的执行结果return result;}}
继续拆分优化二分法
class AddTask extends RecursiveTaskInteger {int begin;int end;public AddTask(int begin, int end) {this.begin begin;this.end end;}Overridepublic String toString() {return { begin , end };}Overrideprotected Integer compute() {// 5, 5if (begin end) {return begin;}// 4, 5 防止多余的拆分 提高效率if (end - begin 1) {return end begin;}// 1 5int mid (end begin) / 2; // 3AddTask t1 new AddTask(begin, mid); // 1,3t1.fork();AddTask t2 new AddTask(mid 1, end); // 4,5t2.fork();int result t1.join() t2.join();return result;}}
ForkJoinPool 实现了工作窃取算法来提高 CPU 的利用率 每个线程都维护了一个双端队列用来存储需要执行的任务 工作窃取算法允许空闲的线程从其它线程的双端队列中窃取一个任务来执行 窃取的必须是最晚的任务避免和队列所属线程发生竞争但是队列中只有一个任务时还是会发生竞争 难在如何拆分后面JDK8就封装到stream的api了并行流