首页 > 其他分享 >多线程填充实体类

多线程填充实体类

时间:2024-05-08 17:12:43浏览次数:16  
标签:实体类 java 填充 JSONObject util entities new import 多线程

import com.alibaba.fastjson.JSONObject;

import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Supplier;

/**
 * 实体类中添加多个执行漫的值,使用多线程的方式执行
 */
public class AsynInitEntitiesUtil<T> {

    private ReentrantLock lock;
    private T entities;
    private Integer timeOut; //执行超时时间
    private TimeUnit unit; //执行超时时间单位
    private ExecutorService executorService;
    private List<Supplier<T>> supplierList;

    public AsynInitEntitiesUtil(T entities, int timeOut, TimeUnit unit) {
        this.supplierList = new ArrayList<>();
        this.lock = new ReentrantLock();
        this.entities = entities;
        this.timeOut = timeOut;
        this.unit = unit;
        this.executorService = Executors.newCachedThreadPool();
    }


    public static void main(String[] args) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(simpleDateFormat.format(new Date()));
        UsersInfo usersInfo = new UsersInfo();
        usersInfo = (UsersInfo) new AsynInitEntitiesUtil(usersInfo, 10, TimeUnit.SECONDS)
                .addTask(() -> new UsersInfo().setId("20"))
                .addTask(() -> new UsersInfo().setName("李明"))
                .addTask(() -> new UsersInfo().setAddress("河北"))
                .execute();


        System.out.println(JSONObject.toJSONString(usersInfo));
        System.out.println(simpleDateFormat.format(new Date()));
    }

    /**
     * 执行多任务
     *
     * @return
     */
    public T execute() {
        try {
            CountDownLatch cd = new CountDownLatch(supplierList.size());
            for (Supplier<T> supplier : supplierList) {
                threadRun(() -> {
                    try {
                        initMap(supplier.get());
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        cd.countDown();
                    }
                });
            }
            cd.await(this.timeOut, unit);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            try {
                if (this.executorService != null) {
                    this.executorService.shutdown();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return this.entities;
    }

    public AsynInitEntitiesUtil addTask(Supplier<T> supplier) {
        supplierList.add(supplier);
        return this;
    }

    public void initMap(T t) {
        lock.lock();
        try {
            String oldParams = JSONObject.toJSONString(entities);
            JSONObject oldOb = JSONObject.parseObject(oldParams);

            String newParams = JSONObject.toJSONString(t);
            JSONObject newOb = JSONObject.parseObject(newParams);
            oldOb.putAll(newOb);
            this.entities = (T) JSONObject.parseObject(oldOb.toJSONString(), t.getClass());
        } finally {
            lock.unlock();
        }
    }

    /**
     * 线程异步执行
     *
     * @param
     */
    public void threadRun(VoidTask voidTask) {
        executorService.execute(() -> {
            voidTask.execute();
        });
    }

    @FunctionalInterface
    private interface VoidTask {
        void execute();
    }
}

 

标签:实体类,java,填充,JSONObject,util,entities,new,import,多线程
From: https://www.cnblogs.com/zhiyong-666/p/18180257

相关文章

  • 【HarmonyOS Next】多线程网络请求简单封装
    importhttpfrom'@ohos.net.http';import{taskpool}from'@kit.ArkTS';exportclassRequest{staticasyncget(url:string,header?:Object,expectDataType:http.HttpDataType=http.HttpDataType.OBJECT):Promise<Object>{......
  • 一行SQL语句实现统计未来7天、按月统计数据,无数据填充0
    1背景由于业务需求,在项目的报表中心中需要未来7天、按月统计数据,且要求按天补全数据,补数据填为0。附实测SQL语句,请大家指正。2举例2.1未来7天,按天补全数据,无数据填充0sql语句:selectt1.lastDaysasx,IFNULL(t2.count,0)asvalfrom(SELECTdate_format(@last......
  • c# 多线程的几种方式 【转载】
    1.什么是线程?进程作为操作系统执行程序的基本单位,拥有应用程序的资源,进程包含线程,进程的资源被线程共享,线程不拥有资源。 2.前台线程和后台线程的区别?程序关闭时,后台线程直接关闭,但前台线程会执行完后关闭。通过Thread类新建线程默认为前台线程。其他方式创建的都是后台线程......
  • 【Python】爬虫之多线程
    线程先来理解一下线程的作用,假如有一个工厂,这个工厂里面只有一条生产线,这一条生产线每周可以生产10件产品,像这样的情况就可以理解为单线程。那么问题来了,如果这家工厂收到了一个生产委托,需要在一周之内生产20件产品,这个时候工厂就可以增加一条生产线,提升产能,这个情况就可以理解为......
  • Java多线程
    程序,进程,线程程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念;进程是执行程序的一次执行过程,是一个动态的概念,是系统资源分配的单位;通常在一个进程中可以包含若干个线程,线程是CPU调度和执行的单位;若是单核cpu,则多线程是模拟出来的,在一个cpu的情况下,在同......
  • 多线程TCP的一些问题
    使用循环堵塞等待客户端连接,连接到一个就开一条线程,当用以下代码,即每次ad重新初始化后其地址作为实参进行线程的创建,结果就是当有新客户端连接,开了新线程时,旧线程看起来会被停止,实际上是因为ad用了地址而不是值作为实参,所以当新连接进来时,ad的值被更改,但地址不变,旧线程所使用的ad......
  • 多线程
    1.相关概念程序(program):为完成特定任务,用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象进程(process):程序的一次执行过程,或是正在内存中运行的应用程序。如:运行中的QQ,运行中的网易音乐播放器。线程(thread):进程可进一步细化为线程,是程序内部的一条执行路径。一个......
  • 我的第一个套接字通信(基本多线程)....
    前排叠个甲:为什么现在才学习到Linux套接字???我的回答是:大一玩了一年,大二开始接触C++,其中呢,大二上学习完了Qt,大二下才开始接触Linux,而在这期间,反复阅读了C++的特性源码....所以。回归正题:直接放代码,没什么好说的,就那一套流程:服务器端的代码:#include<stdio.h>#include<stdlib.h>......
  • Python多线程编程深度探索:从入门到实战
    title:Python多线程编程深度探索:从入门到实战date:2024/4/2818:57:17updated:2024/4/2818:57:17categories:后端开发tags:多线程并发编程线程安全Python异步IO性能优化实战项目第1章:Python基础知识与多线程概念Python简介:Python是一种高级、通用、解释......
  • Java 多线程初步总结
    Java多线程程序,进程,线程的基本概念:程序:是为了完成特定的任务,使用某种语言编写的一组指令的集合,是一段静态的代码,静态对象,如Excel,World等。进程:是程序的一次执行多次,或者是正在运行的一个程序,是一个动态的过程,有自身的产生,存在和消亡的过程,即存在生命周期。线程:进程可以进一步......