j2ee_xx 2018-07-14 00:01 采纳率: 50%
浏览 3477
已结题

就是多线程处理list;以下代码如何能保证list安全呢

package com.gray.test;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class ThreadTest {
public static void main(String[] args) throws Exception {
// 开始时间
long start = System.currentTimeMillis();
// 模拟数据List
List list = new ArrayList();
for (int i = 0; i < 3000; i++) {
list.add(i + "");
}

    ExecutorService exec = Executors.newFixedThreadPool(3);
     CountDownLatch doneSignal = new CountDownLatch(3);
    exec.execute(new PoiWriter(doneSignal,list,0,999));
    exec.execute(new PoiWriter(doneSignal,list,1000,1999));
    exec.execute(new PoiWriter(doneSignal,list,2000,2999));
    doneSignal.await();
    exec.shutdown();
    System.out.println("执行任务消耗了 :" + (System.currentTimeMillis() - start) + "毫秒");


}


protected static class PoiWriter implements Runnable {
    private  CountDownLatch doneSignal;
    private List list;
    private int start;

    private int end;

    public PoiWriter(CountDownLatch doneSignal,List list, int start, int end) {
        this.doneSignal = doneSignal;
        this.start = start;
        this.list = list;
        this.end = end;
    }

    @Override
    public void run() {
        try {
            for (int i = start; i <= end ;i++) {
                list.set(i, Thread.currentThread().getName() +"<--------->" + list.get(i));
                System.out.println(list.get(i));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            doneSignal.countDown();
        }

    }
}

}

  • 写回答

7条回答 默认 最新

  • oyljerry 2018-07-14 00:10
    关注

    用synchronized包裹list操作的部分代码

    评论

报告相同问题?

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境