欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java多線程并發(fā)執(zhí)行demo代碼實例

 更新時間:2020年06月28日 10:15:03   作者:ymh  
這篇文章主要介紹了Java多線程并發(fā)執(zhí)行demo代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

主類:MultiThread,執(zhí)行并發(fā)類

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> 為被處理的數(shù)據(jù)類型
 * @param <T>返回數(shù)據(jù)類型
 * 知識點1:X,T為泛型,為什么要用泛型,泛型和Object的區(qū)別請看: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:計數(shù)器,還是并發(fā)包大神 @author Doug Lea 編寫。是一個原子安全的計數(shù)器,可以利用它實現(xiàn)發(fā)令槍
  private final CountDownLatch startLock = new CountDownLatch(1); // 啟動門,當所有線程就緒時調(diào)用countDown

  private final CountDownLatch endLock; // 結束門

  private final List<X> listData;// 被處理的數(shù)據(jù)

  /**
   * @param list list.size()為多少個線程處理,list里面的H為被處理的數(shù)據(jù)
   */
  public MultiThread(List<X> list) {
    if (list != null && list.size() > 0) {
      this.listData = list;
      exec = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); // 創(chuàng)建線程池,線程池共有nThread個線程
      endLock = new CountDownLatch(list.size()); // 設置結束門計數(shù)器,當一個線程結束時調(diào)用countDown
    } else {
      listData = null;
      exec = null;
      endLock = null;
    }
  }

  /**
   * 
   * @return 獲取每個線程處理結速的數(shù)組
   * @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(); // 線程數(shù)量
      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(); // 所有任務添加完畢,啟動門計數(shù)器減1,這時計數(shù)器為0,所有添加的任務開始執(zhí)行
      endLock.await(); // 主線程阻塞,直到所有線程執(zhí)行完成
      for (Future<T> future : queue) {
        resultList.add(future.get());
      }
      exec.shutdown(); // 關閉線程池
    }
    return resultList;
  }

  /**
   * 每一個線程執(zhí)行的功能,需要調(diào)用者來實現(xiàn)
   * @param currentThread 線程號
   * @param data 每個線程被處理的數(shù)據(jù)
   * @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(); // 線程啟動后調(diào)用await,當前線程阻塞,只有啟動門計數(shù)器為0時當前線程才會往下執(zhí)行
      T t = null;
      try {
        t = execute(currentThread, data);
      } finally {
        endLock.countDown(); // 線程執(zhí)行完畢,結束門計數(shù)器減1
      }
      return t;
    }

    /**
     * 每一個線程執(zhí)行的功能
     * @param currentThread 線程號
     * @param data 每個線程被處理的數(shù)據(jù)
     * @return T返回對象
     */
    public abstract T execute(int currentThread, X data);
  }
}

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

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

參數(shù)類:ParamVO,傳入?yún)?shù)類,根據(jù)實際情況替換成自己的

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) {

        @Override
        public 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) {

        @Override
        public 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();
    }
  }
}

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Lucene實現(xiàn)索引和查詢的實例講解

    Lucene實現(xiàn)索引和查詢的實例講解

    下面小編就為大家分享一篇Lucene實現(xiàn)索引和查詢的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Java中synchronized的幾種使用方法

    Java中synchronized的幾種使用方法

    本文主要介紹了Java中synchronized的幾種使用方法,synchronized可用于修飾普通方法、靜態(tài)方法和代碼塊,下面詳細內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-05-05
  • Spring中的FactoryBean與BeanFactory詳細解析

    Spring中的FactoryBean與BeanFactory詳細解析

    這篇文章主要介紹了Spring中的FactoryBean與BeanFactory詳細解析,在Spring框架中,FactoryBean和BeanFactory是兩個關鍵的接口,用于創(chuàng)建和管理對象實例,它們在Spring的IoC(Inversion of Control,控制反轉(zhuǎn))容器中發(fā)揮著重要的作用,需要的朋友可以參考下
    2023-11-11
  • Hutool開發(fā)MapUtil工具類使用示例

    Hutool開發(fā)MapUtil工具類使用示例

    這篇文章主要為大家介紹了Hutool開發(fā)MapUtil工具類使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 舉例講解Java中數(shù)組和字符串類型的使用方法

    舉例講解Java中數(shù)組和字符串類型的使用方法

    這篇文章主要介紹了舉例講解Java中數(shù)組和字符串類型的使用方法,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • 老生常談spring boot 1.5.4 日志管理(必看篇)

    老生常談spring boot 1.5.4 日志管理(必看篇)

    下面小編就為大家?guī)硪黄仙U剆pring boot 1.5.4 日志管理(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Springboot項目因為kackson版本問題啟動報錯解決方案

    Springboot項目因為kackson版本問題啟動報錯解決方案

    這篇文章主要介紹了Springboot項目因為kackson版本問題啟動報錯解決方案,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 詳解Mybatis中的CRUD

    詳解Mybatis中的CRUD

    這篇文章主要介紹了Mybatis中的CRUD的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • SpringBoot Shiro 權限注解不起作用的解決方法

    SpringBoot Shiro 權限注解不起作用的解決方法

    本文主要介紹了SpringBoot Shiro 權限注解不起作用的解決方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • MyBatis入門學習教程-MyBatis快速入門

    MyBatis入門學習教程-MyBatis快速入門

    MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架,這篇文章主要給大家分享MyBatis的一篇快速入門教程
    2021-06-06

最新評論