龙空技术网

使用FutureTask来实现多线程插入数据

万物生的好物 1071

前言:

如今咱们对“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添加数据