为了账号安全,请及时绑定邮箱和手机立即绑定

Java多线程操作集合的小问题

Java多线程操作集合的小问题

有只小跳蛙 2019-03-21 15:15:39
原来是把List集合用for循环操作,现在想用多线程来弄,想提高点速度。这是先做了个小例子,然后就发现出问题了。停不下来。。。继承Runnable接口的类里的Run方法是这样的, public void run() {        // TODO Auto-generated method stub            //            while (index <list.size()) {                list.get(index).append("namerate", list.get(index).getString("name")+list.get(index).getString("rate"));                System.out.println(Thread.currentThread().getName()+ "正在处理"+this.index++);            }    }在main方法是这样用的 List<Document> list = poitest.getData();        MyThread myThread = new MyThread(list);                 new Thread(myThread, "1号线程").start();         new Thread(myThread, "2号线程").start();         new Thread(myThread, "3号线程").start();         new Thread(myThread, "4号线程").start();         new Thread(myThread, "5号线程").start();        while (flag) {            if (myThread.getIndex() >= list.size()) {                // System.out.println("最后"+myThread.getIndex());                flag = false;            }            // System.out.println(myThread.getIndex()>= list.size());            // System.out.println("mainflag:"+flag);        }下面的两个无论哪个取消注释,都能停止。但是注释后,就显示还在运行。我用debug来看线程的话是这样的Thread [main] (Running) Daemon Thread [cluster-ClusterId{value='58083c114d7c9d336ce66915', description='null'}-127.0.0.1:27017] (Running) Daemon Thread [pool-2-thread-1] (Running)不知道为啥会这样,我加断点用F5执行完却也能结束。。。其实就是想用多线程来处理集合,处理完后再返回,所以我得在main里面判断多线程是否结束,然后才能执行后面的。可这个问题很是诧异啊。我也是菜鸟,看网上都说用线程池什么的,但我想解决我这个问题。之后再有什么锁的问题到时再看。。。
查看完整描述

5 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

ExecutorService exec = Executors.newFixedThreadPool(8);

for(final Object obj : list){

    exec.execute(new Runnable() {

        @Override

        public void run() {

            process(obj)

        }

    });

}


我觉得使用这种方式更好。


查看完整回答
反对 回复 2019-04-25
?
皈依舞

TA贡献1851条经验 获得超3个赞

java8 parallel stream


查看完整回答
反对 回复 2019-04-25
?
守候你守候我

TA贡献1802条经验 获得超10个赞

你这个run()里面最好采用线程同步


查看完整回答
反对 回复 2019-04-25
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

建议给每个线程限定处理集合的索引范围,即分片。
比如: 
一共有5个线程,线程1处理前1/5,线程2处理1/5~2/5...
换成直观理解就是,假设有100个元素,线程1的索引范围为0~19,线程2的索引范围为20~39...

这样能避免线程之间操作相同数据,避免了可能的线程不安全问题。


查看完整回答
反对 回复 2019-04-25
  • 5 回答
  • 0 关注
  • 592 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信