摘要:多线程任务处理对提高性能很有帮助,在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);}可以从以上代码看出,产生了很多个job,我们不想按顺序完成它们,它们之间也没有任何的关系,因此“分布式任务”、maPReduce?现在还太早,步子跨太大容易扯着蛋,先把单机的多任务给完成吧。所以,我们创建了一个线程池,在循环中,不断地把job填充进去,这个线程池不大,只能容纳10个线程同时跑,其它的线程放进去后就得老老实实地排队等待。当然这里只是一个简单的Demo,虽然它包含了“向各线程传入参数”这样东西,更复杂的还有“在主线程中获取各线程结果的返回值”。
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;}}
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!");
来自王安琪
新闻热点
疑难解答