前言:
如今咱们对“javaweb添加数据”可能比较珍视,看官们都想要分析一些“javaweb添加数据”的相关知识。那么小编也在网络上收集了一些对于“javaweb添加数据””的相关知识,希望咱们能喜欢,大家一起来学习一下吧!我们知道java中FutrueTask是一个可得到预期结果的异步线程类,可以用它来优化我们的批量处理任务。
比如你提交一个保存100个订单的数据,处理每个订单的时间为1秒,如果同步使用for循环的话,处理为100个订单大概要100秒。
有人说使用异步线程Thread,但是异步线程我们拿不到线程处理的结果,不能在最后返回给前端。
这时FutrueTask就派上用场了,比如创建5个FutrueTask,5个人同时插入时间,这样每个人大概处理20个左右,总共花费时间为20秒左右
代码如下:
import java.util.ArrayList;import java.util.List;import java.util.concurrent.*;/** * * @author 王子 * 使用FutrueTask模拟批量插入并返回id,收集id * */public class FutrueTask4Insert { public static void main(String[] args) { //线程的个数 int taskNums = 5; int dataNum = 100;//模拟任务数量100个 ExecutorService myexecutors = Executors.newFixedThreadPool(taskNums); List<FutureTask<Long>> myTasks = new ArrayList<>(); long t=System.currentTimeMillis(); // 提交插入任务 for (int i = 0; i < dataNum; i++) { MyTask insertTask = new MyTask(i); FutureTask<Long> task = new FutureTask<>(insertTask); myTasks.add(task); myexecutors.submit(task); System.out.println("正在创建任务------"+i); } // 用来收集返回的id列表 List<Long> dataIds = new ArrayList<>(); // 等待所有任务完成,并收集结果 for (FutureTask<Long> tsk : myTasks) { try { //获取线程返回结果,这里为同步等待 Long insertedId = tsk.get(); //将得到id加入到集合中 dataIds.add(insertedId); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } //挂掉所有的线程池 myexecutors.shutdown(); System.out.println("cost time===="+((System.currentTimeMillis()-t)/1000) +"秒"); // 打印所有的返回结果 System.out.println("所有的插入结果,返回的id列表: " + dataIds); } }/** * @author 王子 * 构造一个callable对象 * */class MyTask implements Callable<Long> { private int param; public MyTask(int param) { this.param = param; } @Override public Long call() throws Exception { Thread.sleep(1000); // 数据插入,耗时模拟1秒 //TODO .......处理数据。。。 System.out.println("正在处理数据------"+param); //模拟插入后,得到的id long result = (long) (param*10); return result; }}
返回结果:
cost time====20秒
如果不是有FutrueTask,是有for循环同步处理,那么时间大概要100左右,我们可以模拟如下:
public static void main(String[] args) {// String aa = findMaxStr("1jiuyuuyigfdsaloo");// System.out.println(aa); long t=System.currentTimeMillis(); for(int i=0;i<100;i++){ try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("cost time===="+((System.currentTimeMillis()-t)/1000) +"秒"); }
耗时为:
cost time====100秒
所有FutureTask可以理解为分工处理,最后统一汇报,耗时取决于处理最慢的那个线程。
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #javaweb添加数据