循环到Executor服务

时间:2017-07-27 02:13:41

标签: java executorservice

我想在下面使用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。

2 个答案:

答案 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相比需要更长的时间。