色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

Java多線程并發執行demo代碼實例

瀏覽:14日期:2022-08-30 11:45:30

主類:MultiThread,執行并發類

package java8test;import java.util.ArrayList;import java.util.List;import java.util.concurrent.BlockingQueue;import java.util.concurrent.Callable;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.LinkedBlockingQueue;/** * @param <H> 為被處理的數據類型 * @param <T>返回數據類型 * 知識點1:X,T為泛型,為什么要用泛型,泛型和Object的區別請看:https://www.cnblogs.com/xiaoxiong2015/p/12705815.html */public abstract class MultiThread<X, T> { public static int i = 0; // 知識點2:線程池:https://www.cnblogs.com/xiaoxiong2015/p/12706153.html private final ExecutorService exec; // 線程池 // 知識點3:@author Doung Lea 隊列:https://www.cnblogs.com/xiaoxiong2015/p/12825636.html private final BlockingQueue<Future<T>> queue = new LinkedBlockingQueue<>(); // 知識點4:計數器,還是并發包大神 @author Doug Lea 編寫。是一個原子安全的計數器,可以利用它實現發令槍 private final CountDownLatch startLock = new CountDownLatch(1); // 啟動門,當所有線程就緒時調用countDown private final CountDownLatch endLock; // 結束門 private final List<X> listData;// 被處理的數據 /** * @param list list.size()為多少個線程處理,list里面的H為被處理的數據 */ public MultiThread(List<X> list) { if (list != null && list.size() > 0) { this.listData = list; exec = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); // 創建線程池,線程池共有nThread個線程 endLock = new CountDownLatch(list.size()); // 設置結束門計數器,當一個線程結束時調用countDown } else { listData = null; exec = null; endLock = null; } } /** * * @return 獲取每個線程處理結速的數組 * @throws InterruptedException * @throws ExecutionException */ public List<T> getResult() throws InterruptedException, ExecutionException { List<T> resultList = new ArrayList<>(); if (listData != null && listData.size() > 0) { int nThread = listData.size(); // 線程數量 for (int i = 0; i < nThread; i++) {X data = listData.get(i);Future<T> future = exec.submit(new Task(i, data) { @Override public T execute(int currentThread, X data) { return outExecute(currentThread, data); }}); // 將任務提交到線程池queue.add(future); // 將Future實例添加至隊列 } startLock.countDown(); // 所有任務添加完畢,啟動門計數器減1,這時計數器為0,所有添加的任務開始執行 endLock.await(); // 主線程阻塞,直到所有線程執行完成 for (Future<T> future : queue) {resultList.add(future.get()); } exec.shutdown(); // 關閉線程池 } return resultList; } /** * 每一個線程執行的功能,需要調用者來實現 * @param currentThread 線程號 * @param data 每個線程被處理的數據 * @return T返回對象 */ public abstract T outExecute(int currentThread, X data); /** * 線程類 */ private abstract class Task implements Callable<T> { private int currentThread;// 當前線程號 private X data; public Task(int currentThread, X data) { this.currentThread = currentThread; this.data = data; } @Override public T call() throws Exception { // startLock.await(); // 線程啟動后調用await,當前線程阻塞,只有啟動門計數器為0時當前線程才會往下執行 T t = null; try {t = execute(currentThread, data); } finally {endLock.countDown(); // 線程執行完畢,結束門計數器減1 } return t; } /** * 每一個線程執行的功能 * @param currentThread 線程號 * @param data 每個線程被處理的數據 * @return T返回對象 */ public abstract T execute(int currentThread, X data); }}

結果類:ResultVO,保存返回結果,根據實際情況替換成自己的

package java8test;public class ResultVo { int i; public ResultVo(int i) { this.i = i; } public ResultVo() { // TODO Auto-generated constructor stub }}

參數類:ParamVO,傳入參數類,根據實際情況替換成自己的

package java8test;public class ParamVo { private int i; ParamVo(int i) { this.i = i; } public int getI() { return i; } @Override public String toString() { return String.valueOf(i) + ' ' + hashCode(); }}

測試類:new兩個MultiThread,可以看到MultiThread這個類不存在線程安全問題。

package java8test;import java.util.ArrayList;import java.util.List;public class Test { public static void main(String[] args) { try { List<ParamVo> splitList = new ArrayList<ParamVo>(); for (int i = 0; i < 100; i++) {splitList.add(new ParamVo(i)); } List<ParamVo> splitList1 = new ArrayList<ParamVo>(); for (int i = 200; i < 300; i++) {splitList1.add(new ParamVo(i)); } MultiThread<ParamVo, ResultVo> multiThread = new MultiThread<ParamVo, ResultVo>(splitList) {@Overridepublic ResultVo outExecute(int currentThread, ParamVo data) { System.out.println('當前線程名稱:' + Thread.currentThread().getName() + '當前線程號=' + currentThread + ' data=' + data); i--; return new ResultVo(data.getI());} }; MultiThread<ParamVo, ResultVo> multiThread1 = new MultiThread<ParamVo, ResultVo>(splitList1) {@Overridepublic ResultVo outExecute(int currentThread, ParamVo data) { System.out.println('當前線程名稱:' + Thread.currentThread().getName() + '當前線程號=' + currentThread + ' data=' + data); i--; return new ResultVo(data.getI());} }; List<ResultVo> list = multiThread.getResult(); List<ResultVo> list1 = multiThread1.getResult(); // 獲取每一批次處理結果 System.out.println('獲取處理結果........................'); for (ResultVo vo : list) {System.out.println(vo.i); } System.out.println('獲取1處理結果........................'); for (ResultVo vo : list1) {System.out.println(vo.i); } } catch (Exception e) { e.printStackTrace(); } }}

這個類也用在了生產當中,用來并發插入數據。但是事務不能被管控,需要自己保證最終事務一致。需要注意。

Java多線程并發執行demo代碼實例

Java多線程并發執行demo代碼實例

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 亚洲人成人毛片无遮挡 | 国产成人香蕉在线视频网站 | 久久韩国 | 日韩一区二区三区不卡视频 | 亚洲国产高清一区二区三区 | 成人免费观看高清在线毛片 | 亚洲国产精品久久精品成人 | 一级特黄aaa大片在线观看 | 免费无遮挡毛片 | 国产美女又黄又爽又色视频免费 | 欧美videos娇小| 极品色在线精品视频 | 国产三级精品在线 | 欧美高清在线精品一区二区不卡 | 亚洲巨乳自拍在线视频 | 欧美在线观看免费一区视频 | 久久天天躁综合夜夜黑人鲁色 | 久久九九国产 | 九九久久免费视频 | 免费视频精品一区二区三区 | 国产欧美日韩在线观看精品 | 国产成人亚洲综合91精品555 | 黄网在线观看免费 | 91久久色| 免费国产成人高清在线看软件 | 长腿美女被啪的欲仙欲死视频 | 国产一区二区三区免费大片天美 | 久热香蕉在线视频 | 99久热在线精品视频播放6 | 亚洲精品久久久久中文 | 成人国产精品一区二区网站 | 成年人午夜免费视频 | 6080伦理久久精品亚洲 | 国产精品毛片va一区二区三区 | 亚洲精品国产一区二区三 | 日韩加勒比| 国产免费一区不卡在线 | 国产三级日本三级美三级 | 亚洲一区二区三区久久精品 | 免费观看国产精品 | 免费欧美一级 |