最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java多線程處理List數(shù)據(jù)

 更新時間:2019年03月20日 11:37:52   作者:吃飯了嗎飯沒了秀  
這篇文章主要介紹了Java多線程處理List數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

實例1:

解決問題:如何讓n個線程順序遍歷含有n個元素的List集合

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.ArrayUtils;

public class Test_4 {
/**
* 多線程處理list
*
* @param data 數(shù)據(jù)list
* @param threadNum 線程數(shù)
*/
public synchronized void handleList(List<String> data, int threadNum) {
int length = data.size();
int tl = length % threadNum == 0 ? length / threadNum : (length
/ threadNum + 1);

for (int i = 0; i < threadNum; i++) {
int end = (i + 1) * tl;
HandleThread thread = new HandleThread("線程[" + (i + 1) + "] ", data, i * tl, end > length ? length : end);
thread.start();
}
}

class HandleThread extends Thread {
private String threadName;
private List<String> data;
private int start;
private int end;

public HandleThread(String threadName, List<String> data, int start, int end) {
this.threadName = threadName;
this.data = data;
this.start = start;
this.end = end;
}

public void run() {
List<String> subList = data.subList(start, end)/*.add("^&*")*/;
System.out.println(threadName+"處理了"+subList.size()+"條!");
}

}

public static void main(String[] args) {
Test_4 test = new Test_4();
// 準備數(shù)據(jù)
List<String> data = new ArrayList<String>();
for (int i = 0; i < 6666; i++) {
data.add("item" + i);
}
test.handleList(data, 5);
System.out.println(ArrayUtils.toString(data));
}
}

實例2:

List多線程并發(fā)讀取讀取現(xiàn)有的list對象

//測試讀取List的線程類,大概34秒
package com.thread.list;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class Main {
  
  public static void main(String[] args) {
    
    List<String> list = new ArrayList<String>();
    Map<Long,Integer> map = new HashMap<Long,Integer>();

    for(int i = 0;i<1000;i++){
      list.add(""+i);
    }
    
    int pcount = Runtime.getRuntime().availableProcessors();    
    long start = System.currentTimeMillis();    
    
    for(int i=0;i<pcount;i++){
      
      Thread t = new MyThread1(list,map);
      map.put(t.getId(),Integer.valueOf(i));
      t.start();
      try {
        t.join();
      } catch (InterruptedException e) {       
        e.printStackTrace();
      }      
      // System.out.println(list.get(i));
    }    
    System.out.println("----"+(System.currentTimeMillis() - start));
  }  
}

//線程類
package com.thread.list;
 
import java.util.List;
import java.util.Map;
 
public class MyThread1 extends Thread {
 
  private List<String> list;
  private Map<Long,Integer> map;
  
  public MyThread1(List<String> list,Map<Long,Integer> map){
    this.list = list;
    this.map = map;
  }
  
  @Override
  public void run() {
    
    int pcount = Runtime.getRuntime().availableProcessors();
    int i = map.get(Thread.currentThread().getId());
    
    for(;i<list.size();i+=pcount){
      System.out.println(list.get(i));
    }       
  }  
}

實例3:

多線程分段處理List集合

場景:大數(shù)據(jù)List集合,需要對List集合中的數(shù)據(jù)同標準庫中數(shù)據(jù)進行對比,生成新增,更新,取消數(shù)據(jù)
解決方案:

  1. List集合分段,
  2. 動態(tài)創(chuàng)建線程池newFixedThreadPool
  3. 將對比操作在多線程中實現(xiàn)
public static void main(String[] args) throws Exception {

    // 開始時間
    long start = System.currentTimeMillis();
    List<String> list = new ArrayList<String>();

    for (int i = 1; i <= 3000; i++) {
      list.add(i + "");
    }
    // 每500條數(shù)據(jù)開啟一條線程
    int threadSize = 500;
    // 總數(shù)據(jù)條數(shù)
    int dataSize = list.size();
    // 線程數(shù)
    int threadNum = dataSize / threadSize + 1;
    // 定義標記,過濾threadNum為整數(shù)
    boolean special = dataSize % threadSize == 0;

    // 創(chuàng)建一個線程池
    ExecutorService exec = Executors.newFixedThreadPool(threadNum);
    // 定義一個任務集合
    List<Callable<Integer>> tasks = new ArrayList<Callable<Integer>>();
    Callable<Integer> task = null;
    List<String> cutList = null;

    // 確定每條線程的數(shù)據(jù)
    for (int i = 0; i < threadNum; i++) {
      if (i == threadNum - 1) {
        if (special) {
          break;
        }
        cutList = list.subList(threadSize * i, dataSize);
      } else {
        cutList = list.subList(threadSize * i, threadSize * (i + 1));
      }
      // System.out.println("第" + (i + 1) + "組:" + cutList.toString());
      final List<String> listStr = cutList;
      task = new Callable<Integer>() {

        @Override
        public Integer call() throws Exception {
          System.out.println(Thread.currentThread().getName() + "線程:" + listStr);
          return 1;
        }
      };
      // 這里提交的任務容器列表和返回的Future列表存在順序?qū)年P(guān)系
      tasks.add(task);
    }

    List<Future<Integer>> results = exec.invokeAll(tasks);

    for (Future<Integer> future : results) {
      System.out.println(future.get());
    }

    // 關(guān)閉線程池
    exec.shutdown();
    System.out.println("線程任務執(zhí)行結(jié)束");
    System.err.println("執(zhí)行任務消耗了 :" + (System.currentTimeMillis() - start) + "毫秒");
  }

以上所述是小編給大家介紹的Java多線程處理List數(shù)據(jù)詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 使用Java提取字符串里的xml標簽

    使用Java提取字符串里的xml標簽

    在Java中,我們經(jīng)常需要處理XML數(shù)據(jù),有時候,我們需要從一個包含XML標簽的字符串中提取出這些標簽,本文將介紹如何使用Java代碼來獲取字符串中的XML標簽,需要的可以參考下
    2024-12-12
  • 一文帶你搞懂Java中線程的創(chuàng)建方式

    一文帶你搞懂Java中線程的創(chuàng)建方式

    這篇文章主要為大家詳細介紹了Java中線程的創(chuàng)建方式的相關(guān)知識,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2023-03-03
  • Eclipse添加servlet模板過程代碼詳解

    Eclipse添加servlet模板過程代碼詳解

    這篇文章主要介紹了Eclipse添加servlet模板過程代碼詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Springboot中@scheduled注解解析

    Springboot中@scheduled注解解析

    這篇文章主要介紹了Springboot中@scheduled注解解析,定時任務就是在指定時間執(zhí)行程序,或周期性執(zhí)行計劃任務,Java中實現(xiàn)定時任務的方法有很多,本文從從JDK自帶的一些方法來實現(xiàn)定時任務的需求,需要的朋友可以參考下
    2023-09-09
  • SpringBoot3安全管理操作方法

    SpringBoot3安全管理操作方法

    這篇文章主要介紹了SpringBoot3安全管理,在實際開發(fā)中,最常用的是登錄驗證和權(quán)限體系兩大功能,在登錄時完成身份的驗證,加載相關(guān)信息和角色權(quán)限,在訪問其他系統(tǒng)資源時,進行權(quán)限的驗證,保護系統(tǒng)的安全,文中有詳細的操作步驟,需要的朋友可以參考下
    2023-08-08
  • SpringCloud GateWay動態(tài)路由用法

    SpringCloud GateWay動態(tài)路由用法

    網(wǎng)關(guān)作為所有項目的入口,不希望重啟,因此動態(tài)路由是必須的,動態(tài)路由主要通過RouteDefinitionRepository接口實現(xiàn),其默認的實現(xiàn)是InMemoryRouteDefinitionRepository,即在內(nèi)存中存儲路由配置,可基于這個map對象操作,動態(tài)路由的實現(xiàn)方案有兩種
    2024-10-10
  • Java多線程系列之JDK并發(fā)包舉例詳解

    Java多線程系列之JDK并發(fā)包舉例詳解

    Java并發(fā)包提供了許多用于多線程編程的類和接口,這篇文章主要給大家介紹了關(guān)于Java多線程系列之JDK并發(fā)包的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • spring WebSocket示例詳解

    spring WebSocket示例詳解

    websocket是Html5新增加特性之一,目的是瀏覽器與服務端建立全雙工的通信方式,本篇文章主要介紹了spring WebSocket示例詳解 ,有興趣的可以了解一下。
    2017-01-01
  • Java計算字符串公式的方式解讀

    Java計算字符串公式的方式解讀

    這篇文章主要介紹了Java計算字符串公式的方式解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 一文帶你了解Java萬物之基之Object類

    一文帶你了解Java萬物之基之Object類

    Java是一門天然的面向?qū)ο蟮恼Z言。而所有我們手動創(chuàng)造出來的類,都繼承于同一個類,即Object類。本文將通過示例為大家詳細介紹一下Java中的Object類,需要的可以參考一下
    2022-03-03

最新評論

龙游县| 桐城市| 当阳市| 宁晋县| 卢湾区| 江油市| 昭苏县| 晴隆县| 湖口县| 淳安县| 新建县| 凌云县| 玛多县| 赣州市| 正阳县| 天台县| 营山县| 稻城县| 荔波县| 会泽县| 庆云县| 石屏县| 洪洞县| 上虞市| 黔南| 桂东县| 灵宝市| 西乌珠穆沁旗| 武陟县| 惠安县| 乌审旗| 温泉县| 浦县| 韶山市| 筠连县| 桃源县| 苍南县| 康乐县| 阿拉善右旗| 保德县| 罗田县|