Java 多线程处理一个List

Java 多线程处理一个List,第1张

import java.util.ArrayList

import java.util.List

import org.apache.commons.lang3.ArrayUtils

public class Test_4 {

    /**

     * 多线程处理list

     * 

     * @param data  数据list

     * @param threadNum  线程数

     */

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

            // TODO 这里处理数据

            data.subList(start, end).add("^&*")

            System.out.println(threadName)

        }

    }

    public static void main(String[] args) {

        Test_4 test = new Test_4()

        // 准备数据

        List<String> data = new ArrayList<String>()

        for (int i = 0 i < 5000 i++) {

            data.add("item" + i)

        }

        test.handleList(data, 5)

        System.out.println(ArrayUtils.toString(data))

    }

}

ArrayList集合是不行的激雹,如果多线程同时添加元素,有可能产生线程安全问题态碧,程序也有可能报错。

例如:一个线程正准备往进去写数据,突然切到另一个线程它先写了进入,在切回来这个线程并不知道这个位置已经写入了数据,所以它还是会傻傻的写入数据,这样另一个线程的数据就被覆盖了。如果是一边添加 ,一边遍历的话程序会产生ConcurrentModificationException异常。

所以要用copyonwritearraylist是最明闭帆好的选择,但是注意的是,添加元素时它的性能不是很好 。

第一个,add那里,如果只是add,则不需要lock,如果你add前需要先判断,避免重复add,那需要lock;

第二个,jianList,这个函伏晌数是干嘛的,作用不明确,因此不知道是否需要lock。

另返数外,lock的对漏厅首象不需要是list本身,可以另外定义一个static的object就行。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11989134.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存