大规模任务Runnable或Callable的替代模式

Tho*_*mas 4 java multithreading

对于大规模并行计算,我倾向于使用执行程序和可调用程序.当我有数千个要计算的对象时,我觉得为每个对象实例化数千个Runnables并不是那么好.

所以我有两种方法来解决这个问题:

.将工作负载分成少量x工作者,每个工作者都给出y对象.(将对象列表拆分为每个y/x-size的x分区)

public static <V> List<List<V>> partitions(List<V> list, int chunks) {
      final ArrayList<List<V>> lists = new ArrayList<List<V>>();
      final int size = Math.max(1, list.size() / chunks + 1);
      final int listSize = list.size();
      for (int i = 0; i <= chunks; i++) {
         final List<V> vs = list.subList(Math.min(listSize, i * size), Math.min(listSize, i * size + size));
         if(vs.size() == 0) break;
         lists.add(vs);
      }
      return lists;
   }
Run Code Online (Sandbox Code Playgroud)

.创建从队列中获取对象的x-worker.

问题:

  • 创建数千个Runnables真的很贵并且要避免吗?
  • 是否有一个通用模式/建议如何通过解决方案II
  • 你知道一种不同的方法吗?

Dav*_*INO 5

创建数千个Runnable(实现对象Runnable)并不比创建普通对象更昂贵.

创建和运行数千个线程可能非常繁重,但您可以使用Executors线程池来解决此问题.