国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java多線程查表(封裝方法 多表通用)

這篇具有很好參考價值的文章主要介紹了Java多線程查表(封裝方法 多表通用)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

經(jīng)過多線程的學(xué)習(xí)和實踐 總結(jié)了兩種多線程查表方法?

兩種方法都經(jīng)過我的封裝 某表使用時 server層加上方法sql即可

查詢流程:

1 count全表條數(shù)

2 通過總條數(shù) 將全表數(shù)據(jù)分為10份

3 開辟10個線程查詢limit語句(線程數(shù)可自定義)

以下方法均以mysql數(shù)據(jù)庫測試 其他庫同理

目錄

一?線程池方法

二 @Async注解方法


一?線程池方法

controller層

int totalNum = testService.countNum(new testTable());
//重寫多線程中引用的方法
List<T> threadHandle = ThreadPoolUtils.threadPool(totalNum, new ThreadTableDataQuery() {
    @Override
    public List<T> selectTableData(Integer page, Integer limit) throws Exception {
        return testService.selectTableData(page, limit);
    }
});
//lambda表達(dá)式寫法
//List<T> threadHandle = ThreadPoolUtils.threadPool(totalNum, (page, limit) -> testService.selectTableData(page, limit));
//轉(zhuǎn)換為list對象
List<TestTable> test= JSON.parseArray(JSON.toJSONString(threadHandle), testTable.class);

當(dāng)數(shù)據(jù)量多時 JSON.parseArray和JSON.toString轉(zhuǎn)換方法較慢

下篇文章我再介紹下泛型List轉(zhuǎn)List對象(Json轉(zhuǎn)換工具類)https://blog.csdn.net/weixin_56567361/article/details/128116842

java反射方式和強轉(zhuǎn)方法比阿里巴巴fastJson方式快了40多倍

ThreadPoolUtils

import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.*;

/**
 * 多線程查全表通用工具類
 */

public class ThreadPoolUtils {

    /**
     * 定義十個線程
     */
    private static final ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());

    /**
     * 多線程查全表(通用)
     * ThreadPoolExecutor線程池方法
     *
     * @param totalNum             總條數(shù)
     * @param threadTableDataQuery 查詢方法(需要新建接口類)
     * @return
     */
    public static List<T> threadPool(int totalNum, ThreadTableDataQuery threadTableDataQuery) throws Exception {
        //將ArrayList轉(zhuǎn)換為線程安全的SynchronizedList
        List<T> result = Collections.synchronizedList(new ArrayList<>(NumberUtils.arrayListRightSize(totalNum)));
//        List<T> result = new CopyOnWriteArrayList<>();
        //數(shù)據(jù)量超出10 即使用線程異步處理
        if (totalNum > 10) {
            //將數(shù)據(jù)分組 分成10份 計算每份的條數(shù)
            int remainder = totalNum % 10;
            int size = remainder > 0 ? totalNum / 10 + 1 : totalNum / 10;
            CountDownLatch downLatch = new CountDownLatch(10);
            for (int i = 0; i < 10; i++) {
                int page = i * size;
                executor.submit(() -> {
                    try {
                        result.addAll(threadTableDataQuery.selectTableData(page, size));
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        downLatch.countDown();
                    }
                });
            }
            try {
                downLatch.await();
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            result.addAll(threadTableDataQuery.selectTableData(0, 10));
        }
        return result;
    }

}

ThreadTableDataQuery接口

import org.apache.poi.ss.formula.functions.T;

import java.util.List;


public interface ThreadTableDataQuery {

    /**
     * 線程池接口類 查詢方法
     *
     * @param page
     * @param limit
     * @return
     * @throws Exception
     */
    public List<T> selectTableData(Integer page, Integer limit) throws Exception;
}

interface接口

    /**
     * 泛型查詢
     *
     * @param page
     * @param limit
     * @return
     */
    public List<T> selectTableData(Integer page, Integer limit);

server層

    /**
     * 泛型查詢
     *
     * @param page
     * @param limit
     * @return
     */
    public List<T> selectTableData(Integer page, Integer limit);

impl層

    /**
     * 泛型查詢
     *
     * @param page
     * @param limit
     * @return
     */
    @Override
    public List<T> selectTableData(Integer page, Integer limit) {
        return testMapper.selectTableData(page,limit);
    }

mapper層

import org.apache.ibatis.annotations.Param; 

   /**
     * 泛型查詢
     *
     * @param
     * @return
     */
    public List<T> selectTableData(@Param("page") Integer page, 
                                   @Param("limit") Integer limit);

xml文件

    <select id="selectTableData" parameterType="..." resultMap="...">
        select id, test, name from test_table
        <if test="page != null">limit #{page},#{limit}</if>
    </select>

二 @Async注解方法

controller層

int totalNum = testService.countNum(new testTable());
//重寫多線程中引用的方法
List<T> threadAsync = ThreadPoolUtils.threadAsync(totalNum, new ThreadAsyncTableDataQuery() {
    @Override
    public Future<List<T>> selectTableDataAsync(Integer page, Integer limit) throws Exception {
        return testService.selectTableDataAsync(page, limit);
    }
});
//lambda表達(dá)式寫法
//List<T> threadAsync = ThreadPoolUtils.threadAsync(totalNum, (page, limit) -> testService.selectTableDataAsync(page, limit));
//轉(zhuǎn)換為list對象
List<TestTable> test= JSON.parseArray(JSON.toJSONString(threadAsync), testTable.class);

調(diào)用方法和上面線程池方法類似

ThreadPoolUtils

import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.*;

/**
 * 多線程查全表通用工具類
 */
public class ThreadPoolUtils {

    /**
     * 多線程查全表(通用)
     * 注解@Async線程方法
     *
     * @param totalNum
     * @param threadAsyncTableDataQuery
     * @return
     * @throws Exception
     */
    public static List<T> threadAsync(int totalNum, ThreadAsyncTableDataQuery threadAsyncTableDataQuery) throws Exception {

        List<Future<List<T>>> list = new ArrayList<>();
        if (totalNum > 10) {
            int remainder = totalNum % 10;
            int size = remainder > 0 ? totalNum / 10 + 1 : totalNum / 10;
            for (int i = 0; i < 10; i++) {
                int page = i * size;
                Future<List<T>> pv = threadAsyncTableDataQuery.selectTableDataAsync(page, size);
                list.add(pv);
            }
        } else {
            Future<List<T>> ts = threadAsyncTableDataQuery.selectTableDataAsync(0, 10);
            list.add(ts);
        }
        return ThreadPoolUtils.taskValue(list);
    }

    /**
     * 拿取線程里的數(shù)據(jù)
     *
     * @param taskFutures
     * @return
     */
    public static List<T> taskValue(List<Future<List<T>>> taskFutures) {
        List<T> result = new ArrayList<>();
        try {
            for (Future<List<T>> future : taskFutures) {
                List<T> obj = future.get();
                if (null != obj) {
                    result.addAll(obj);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }


}

ThreadAsyncTableDataQuery接口

import org.apache.poi.ss.formula.functions.T;

import java.util.List;
import java.util.concurrent.Future;


public interface ThreadAsyncTableDataQuery {

    /**
     * 注解多線程接口類 查詢方法
     *
     * @param page
     * @param limit
     * @return
     * @throws Exception
     */
    public Future<List<T>> selectTableDataAsync(Integer page, Integer limit) throws Exception;
}

server層

    /**
     * 注解多線程泛型查詢
     *
     * @param page
     * @param limit
     * @return
     */
    public Future<List<T>> selectTableDataAsync(Integer page, Integer limit);

impl層

核心注解:@Async

不加就相當(dāng)于普通循環(huán)查

import org.springframework.scheduling.annotation.Async;
import java.util.concurrent.Future;
   
    /**
     * 注解多線程泛型查詢
     *
     * @param page
     * @param limit
     * @return
     */
    @Async
    @Override
    public Future<List<T>> selectTableDataAsync(Integer page, Integer limit) {
        List<T> ts = testMapper.selectTableDataAsync(page,limit);
        return new AsyncResult<>(ts);
    }

mapper層?

import org.apache.ibatis.annotations.Param; 

   /**
     * 注解多線程泛型查詢
     *
     * @param
     * @return
     */
    public List<T> selectTableDataAsync(@Param("page") Integer page, 
                                        @Param("limit") Integer limit);

xml文件

    <select id="selectTableDataAsync" parameterType="..." resultMap="...">
        select id, test, name from test_table
        <if test="page != null">limit #{page},#{limit}</if>
    </select>

啟動程序

加上@EnableAsync注解

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.scheduling.annotation.EnableAsync;

/**
 * 啟動程序
 */
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
@EnableAsync
public class RuoYiApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(RuoYiApplication.class, args);
}

速度測試

兩種多線程方法都已介紹完 相比之下@Async更簡便 容易理解些

現(xiàn)在上個測試圖 看下速度

java多線程查詢,開發(fā)合集,java,開發(fā)語言,sql,mysql,大數(shù)據(jù)

數(shù)據(jù)量約18w條
mybatis-plus耗時:3574ms
線程池方法耗時:541ms
注解多線程耗時:467ms
十次分割limit耗時:3259ms
單個sql耗時:1171ms

測試發(fā)現(xiàn) 兩種多線程方法都比普通的sql查詢快了一倍 當(dāng)數(shù)據(jù)越多時 線程優(yōu)勢越明顯?

最后 兩種封裝的多線程查表方法就講到這里啦

如果寫的有什么問題 或大家有什么有疑問 歡迎評論區(qū)討論哦???文章來源地址http://www.zghlxwxcb.cn/news/detail-654096.html

到了這里,關(guān)于Java多線程查表(封裝方法 多表通用)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【后端面經(jīng)-Java】Java創(chuàng)建線程的方法簡介

    目錄 1. 線程的基本概念 1.1 線程 1.2 線程狀態(tài)和生命周期 2. 創(chuàng)建線程的四種方法 2.1 繼承Thread類 2.2 實現(xiàn)Runnable接口 2.3 實現(xiàn)Callable接口 2.4 使用線程池 3. 參考資料 學(xué)過操作系統(tǒng)的同學(xué)應(yīng)該不陌生,線程是計算機中的最小調(diào)度單元,一個進(jìn)程可以有多個線程,執(zhí)行并發(fā)操作,提

    2024年02月09日
    瀏覽(20)
  • 用PHP封裝一個強大且通用的cURL方法

    用PHP封裝一個強大且通用的cURL方法。 用PHP封裝一個強大且通用的cURL方法。 用PHP封裝一個強大且通用的cURL方法。 用PHP封裝一個強大且通用的cURL方法。

    2024年02月14日
    瀏覽(37)
  • Java 進(jìn)階(8) 線程常用方法

    Java 進(jìn)階(8) 線程常用方法

    方法名 說明 public static void sleep(long millis) 當(dāng)前線程主動休眠 millis 毫秒。 public static void yield() 當(dāng)前線程主動放棄時間?,回到就緒狀態(tài),競爭下?次時間?。 public final void join() 允許其他線程加?到當(dāng)前線程中。 public void setPriority(int) 線程優(yōu)先級為1-10,默認(rèn)為5,優(yōu)先級越?,

    2023年04月16日
    瀏覽(17)
  • java復(fù)習(xí)-線程常用操作方法

    java復(fù)習(xí)-線程常用操作方法

    線程的主要方法都定義在 Thread類 之中,因此此處就是學(xué)習(xí)Thread中的方法。 構(gòu)造方法: public Thread(Runnable target, String name) 設(shè)置名字: public final synchronized void setName(String name) 取得名字: public final String getName() 范例1:觀察線程的名字 結(jié)果: 線程A 線程B Thread-0 總結(jié): 說明開發(fā)

    2024年02月08日
    瀏覽(16)
  • java 獲取當(dāng)前線程的方法

    java 獲取當(dāng)前線程的方法

    ? 我們知道,線程是程序運行的基本單元,是程序中各進(jìn)程之間通信的橋梁,一個線程的創(chuàng)建和銷毀直接影響整個程序的運行效率。 我們在 Java中經(jīng)常使用 Runnable接口來獲取當(dāng)前線程,獲取線程的主要目的就是為了快速地啟動進(jìn)程。但是,由于 Runnable接口實現(xiàn)復(fù)雜,因此我們

    2024年02月01日
    瀏覽(42)
  • 常用的Java線程阻塞業(yè)務(wù)方法

    在Java中常常使用到多線程處理一些業(yè)務(wù),但是也會遇到多線程處理時帶來的業(yè)務(wù)邏輯時序不對問題,例如需要等待一個業(yè)務(wù)處理完或者下一步的邏輯需要等待多線程得到的結(jié)果,下面是幾種常用的方法 使用 Thread.join() 方法 對于已知的線程列表,可以遍歷列表并調(diào)用每個線程

    2024年04月29日
    瀏覽(23)
  • Java多線程——并發(fā)和并行、實現(xiàn)方法

    Java多線程——并發(fā)和并行、實現(xiàn)方法

    代碼演示 方式一 方式二 方式三

    2024年01月16日
    瀏覽(21)
  • 線程方法接收參數(shù)示例,Java的兩種線程實現(xiàn)方式區(qū)別

    總所周知,Java實現(xiàn)多線程有兩種方式,分別是繼承Thread類和實現(xiàn)Runable接口,那么它們的區(qū)別是什么? 繼承 Thread 類: 通過繼承 Thread 類,你可以創(chuàng)建一個直接表示線程的類。你可以覆蓋 Thread 類中的 run 方法來定義線程的邏輯。當(dāng)調(diào)用 start 方法啟動線程時,會執(zhí)行該類中的

    2024年02月11日
    瀏覽(54)
  • Java多線程 - 創(chuàng)建線程池的方法 - ThreadPoolExecutor和Executors

    Java多線程 - 創(chuàng)建線程池的方法 - ThreadPoolExecutor和Executors

    線程池介紹 什么是線程池 ? 線程池就是一個可以復(fù)用線程的技術(shù)。 不使用線程池的問題 : 如果用戶每發(fā)起一個請求,后臺就創(chuàng)建一個新線程來處理,下次新任務(wù)來了又要創(chuàng)建新線程,而創(chuàng)建新線程的開銷是很大的,這樣會嚴(yán)重影響系統(tǒng)的性能。 線程池工作原理 : 例如線程池

    2023年04月16日
    瀏覽(20)
  • Java 多線程之自定義線程池(ThreadPool)使用方法

    線程池是一種 管理和復(fù)用線程 的機制,它包含一組預(yù)先創(chuàng)建的線程,用于執(zhí)行各種任務(wù)。線程池的主要作用是提高多線程應(yīng)用程序的性能和效率,并提供對線程的生命周期和資源的管理,包括線程的創(chuàng)建、銷毀和復(fù)用。 本文主要討論線程池執(zhí)行器(ThreadPoolExecutor)的用法,

    2024年04月26日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包