我想在下面使用JavaExecutor服务:
ffmpeg -i video/test.mp4 -c:v libx264 -profile:v high -level 5 -crf 18 -preset medium -maxrate 10M -bufsize 16M -pix_fmt yuv420p -vf "scale=iw*sar:ih, scale=\'if(gt(iw,ih),min(1920,iw),-1)\':\'if(gt(iw,ih),-1,min(1080,ih))\'" -x264opts bframes=3:cabac=1 -movflags faststart -b:a 320k -y video/test.mp4 -vcodec mjpeg -vframes 1 -an -f rawvideo -s 410x231 video/testthumb.jpg 2>&1
和for循环一样,完成所花费的时间太多而且永远都是需要的。所以我想在executorService中使用它,以便可以更快地完成任务。任何人都可以建议如何使用Executor服务吗?
注意:使用Java 7。
答案 0 :(得分:1)
您应该使用并行流。
listA.parallelStream()
.forEach(s -> listB.parallelStream()
.forEach(s1 -> listC.parallelStream()
.forEach(s2 -> {
// API call
})));
答案 1 :(得分:1)
以下代码段是针对此问题使用ExecutorService的示例。
public static void main(String[] args) throws Exception {
int numRunnables = 3;
ArrayList<String> listB = new ArrayList<String>();
ArrayList<String> listC = new ArrayList<String>();
BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(numRunnables, true);
RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();
ExecutorService executor = new ThreadPoolExecutor(numRunnables, numRunnables, 0L, TimeUnit.MILLISECONDS, queue, handler);
HashMap<String, String> multiMap = new HashMap<>();
for(String s : multiMap.keySet()){
executor.execute(new Runnable() {
@Override
public void run() {
for(String s1 : listB){
for(String s2 : listC){
}
}
}
});
}
executor.shutdown();
while (executor.isTerminated() == false){
Thread.sleep(50);
}
}
另外,我认为'ExecutorService executor = Executors.newFixedThreadPool(numThreads);'是一个很少使用的函数,但它更容易访问,因此经常被ExecutorService的初始用户使用。当有许多Runnables,每个Runnables花费相对较长时间,使用Executors.newFixedThreadPool中的执行程序会导致内存问题,然后与上面的我的代码片段创建的ThreadPoolExecutor相比需要更长的时间。