ThreadpoolExecutor和主线程并行执行

时间:2016-11-24 12:09:47

标签: java multithreading threadpoolexecutor

线程池执行程序正在与主线程并行执行。主线程不会等到执行程序关闭。

public static void main(String[] args) {
        Date jobStartTime = null;


        LOGGER.info("MainApp::Job started");
        try {

            MainApp obj = new MainApp();
            // Getting the job Id of the job
            String jobName=args[0]; //batch name
            String fileName=args[1]; //sqoop file

            LOGGER.info("MainApp::jobName: "+jobName+" fileName "+fileName);

            currentJobID = obj.getMaxJobId(jobName);

            LOGGER.info("MainApp:Job Id is" + currentJobID);

            // Getting the start time of the job
            jobStartTime = commonDB.getTime();
            LOGGER.info("MainApp:Job Start time is" + jobStartTime);

            JobDetails job=new JobDetails(currentJobID,jobName,fileName);

            // Reading and parsing the sqoop file and executing the sqoop commands
            CommandGenerator exec=new CommandGenerator();
            List<TableInfo> commandList = exec.parseAndExec(job);

            ThreadPoolExecutor tp = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
            for (final TableInfo table : commandList) {
                ParallelExecutor pe = new ParallelExecutor(table);
                tp.execute(pe);
            }

            tp.shutdown();

            while(!tp.isShutdown()){

            }

            job=new JobDetails(currentJobID,jobName,fileName,jobStartTime);
            //put everything in one method
            StatusAndMailUtils status=new StatusAndMailUtils();
            status.onJobCompletion(job);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            LOGGER.info("MainApp::Exception");
            e.printStackTrace();
        }

    }

我已经使用了while循环来保持主线程等待,而执行程序线程正在进行中。但是,它没有帮助。请让我知道如何使主线程等待。

while(!tp.isShutdown()){

                }

3 个答案:

答案 0 :(得分:3)

调用shutdown()后,您可以使用awaitTermination(long timeout, TimeUnit unit)来阻止调用线程,直到所有任务都完成执行。

作为超时,你可以使用一个过大的值,如果你想等待任务完成所需的时间,但是如果一个任务永远不会结束你的线程会让你的线程永远等待,最好设置一个合理的超时,以便在异常太长时执行某些任务。

例如:

tp.shutdown();
tp.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);

答案 1 :(得分:2)

当然不等了。这就是创建线程池的整个想法,因此您的主线程可以在线程池执行其他任务时执行其他任务。

在线程池完成任务时,您可以使用awaitTermination(long timeout, TimeUnit unit)方法暂停主线程。

答案 2 :(得分:1)

您也可以提交这些Runnable并等待它们完成。在抛出异常之前,还可以指定等待线程执行的超时。

List<Future<ParallelExecutor>> tasks = new ArrayList<>();
ExecutorService tp = Executors.newFixedThreadPool(10);
for (final TableInfo table : commandList) {
   ParallelExecutor pe = new ParallelExecutor(table);
   tasks.add(tp.submit(pe));
}

for (Future<ParallelExecutor > p : tasks) {
   p.get(); // with timeout p.get(10, TimeUnit.SECONDS);
}

tp.shutdown();