标签:
摘要:多线程任务处理对提高性能很有帮助,在Java中提供的线程池也方便了对多线程任务的实现。使用它很简单,而如果进行了不正确的使用,那么代码将陷入一团乱麻。因此如何正确地使用它,如以下分享,这个技能你get到没?
关键词:多线程, 线程池, 数据库, 算法
解决问题:如何正确使用线程池。
众所周知,线程池在Java中非常常用,使用它也是一项最基本的技能。不过怎样才能更合理、更方便地使用线程池,我们需要总结一下。
ExecutorService jobPool = Executors.newFixedThreadPool(10); while(true){ Job_anqi job_anqi = new GetData_anqi(); job_anqi.setParm(parm); jobPool.submit(job_anqi); }
ExecutorService executorService =Executors.newCachedThreadPool(); List<Future<String>> resultList =newArrayList<Future<String>>(); // 创建10个任务并执行 for(int i =0; i <10; i++){ // 使用ExecutorService执行Callable类型的任务,并将结果保存在future变量中 Future<String> future = executorService.submit(newTaskWithResult(i)); // 将任务执行结果存储到List中 resultList.add(future); } executorService.shutdown(); // 遍历任务的结果 for(Future<String> fs : resultList){ try{ System.out.println(fs.get());// 打印各个线程(任务)执行的结果,其中会偶尔抛出异常 }catch(InterruptedException e){ e.printStackTrace(); }catch(ExecutionException e){ executorService.shutdownNow();//某一线程发生异常时,关闭线程池 e.printStackTrace(); return; } }
线程们可以按天来划分,每天起一个线程,多少天就起多少个线程丢在里面;2、
同时,线程们也可以按数据形式来划分,每一种数据形式起一个线程,有多少种数据形式就开多少个线程;3、
再者,线程干脆按粒度来划分,我每一千个数据批次包装成一个线程,无论天、无论数据形式,只是每千条数据一个线程地跑;4、
甚至,你可以线程池中套线程池,每天一个线程,再在每天的数据里对每种数据形式开一个线程,再在每种数据形式里每千条数据一个线程地跑。这就有很复杂的场景了。
ExecutorService jobPool =Executors.newFixedThreadPool(10); while(true){ Job_anqi job_anqi =newGetData_anqi(); job_anqi.setParm(parm); jobPool.submit(job_anqi); } pool.shutdown(); try{ while(!jobPool.isTerminated()){ Thread.sleep(1000); } }catch(InterruptedException e){ e.printStackTrace(); } logger.info("angel wang 做完了所有的工作, Good job!");
标签:
原文地址:http://www.cnblogs.com/wgp13x/p/4673725.html