JAVA使用多个线程操作一个集合中的数据(不会重复调用集合中的数据哦)--详解

当你想使用JAVA的多线程对一个集合进行处理的时候,我们可以将一个集合分成Thread份数据,每份数据交给一个线程执行
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;


public class TestApp {

    private static final String model = TestApp.class.getName();

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 111; i++) {
            list.add(i + ",");
        }
        StringBuffer coupons = getCoupons(list, 5);
        System.out.println(coupons);
    }

    public static StringBuffer getCoupons(List<String> list , final int threadNum){
        int size = list.size();
        if (size == 0 || list == null){
            return null;
        }
        StringBuffer bf = new StringBuffer();
        ExecutorService executorService = Executors.newFixedThreadPool(threadNum);
        List<Future<String>> futures = new ArrayList<Future<String>>(size);
        for (int i = 0; i < threadNum; i++) {
            //将数据分成threadNum份,线程同时执行
            final List<String> subList = list.subList(size / threadNum * i, size / threadNum * (i + 1));
            Callable<String> task = new Callable<String>() {
                @Override
                public String call() throws Exception {
                    StringBuffer buffer = new StringBuffer();
                    //对每个线程(线程中的每份数据)的逻辑操作
                    for (String subString : subList) {
//                        System.out.println(subString);
                        buffer.append(subString);
                    }
                    return buffer.toString();
                }
            };
            //添加线程到队列
            futures.add(executorService.submit(task));
        }

        for (int i = 0; i < futures.size(); i++) {
            try {
                bf.append(futures.get(i).get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
        //结束线程执行
        executorService.shutdown();
        return bf;
    }
}
将代码中的每份数据处理的逻辑改为想要处理的集合中的逻辑数据即可~

小哥哥小姐姐们可以帮忙点点赞哦~

版权声明:本文为weixin_48960305原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。