Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';这是一种从并行评估切换到顺序评估的干净方法吗?_Java_Multithreading_Parallel Processing - Fatal编程技术网

Java 什么';这是一种从并行评估切换到顺序评估的干净方法吗?

Java 什么';这是一种从并行评估切换到顺序评估的干净方法吗?,java,multithreading,parallel-processing,Java,Multithreading,Parallel Processing,在分治算法中,如果需要,将分割的问题片段发送到单独的线程是有意义的 每一块都足够大,而且 还没有太多线程在运行 简单示例:在merge-sort中,给定50000000个元素列表,将前半部分发送到一个线程,将第二部分发送到另一个线程,以此类推几次是有意义的,但在某个点上(我可以想象,在一台典型的PC上最多进行四次拆分之后),线程开销超过了任何收益。编写代码以从拆分线程过渡到不拆分线程的最佳方法是什么?“将前半部分发送到一个线程,将第二部分发送到另一个线程是有意义的”-不,因为每个线程的确切时间可

在分治算法中,如果需要,将分割的问题片段发送到单独的线程是有意义的

  • 每一块都足够大,而且
  • 还没有太多线程在运行
  • 简单示例:在merge-sort中,给定50000000个元素列表,将前半部分发送到一个线程,将第二部分发送到另一个线程,以此类推几次是有意义的,但在某个点上(我可以想象,在一台典型的PC上最多进行四次拆分之后),线程开销超过了任何收益。编写代码以从拆分线程过渡到不拆分线程的最佳方法是什么?

    “将前半部分发送到一个线程,将第二部分发送到另一个线程是有意义的”-不,因为每个线程的确切时间可能不同。因此,一个线程完成,第二个线程单独继续,从而降低了并行性

    因此,要求如下:

  • 每个部件都足够大,并且有许多部件,以保持处理器负载的平衡

  • 还没有太多线程在运行,因为许多线程只消耗内存,并没有提高性能


  • 因此,工作件数!=线程数。这意味着应该使用线程池。将工作拆分为多个部分与选择线程池的大小无关。工件越大,切换越少,但平衡性越差。根据经验,应该有>100个片段,每个片段的执行时间为1到1000毫秒。线程池的侧面是可用处理器的数量,乘以works进行I/O时的某个因素。

    您面临的问题可以通过使用Java的Fork/Join框架来解决。ForkJoinPool不会产生很多线程,而是在一些线程等待时重用它们。FJP的创建正是为了解决设备和征服问题