gpt4 book ai didi

java - 带参数的 for 循环中的多线程

转载 作者:行者123 更新时间:2023-12-02 02:12:20 24 4
gpt4 key购买 nike

我相信得到的数据是错误的,因为实例变量不是线程安全的。

我尝试使用多线程,基于列表一次打开(最多)13 个线程。我在服务中使用它,需要将参数传递到 run 方法中,因此我创建了一些实例变量并设置它们。我还希望在继续第一个 for 循环的下一次迭代之前执行这十三个方法

private EnergyPortalGroup superGroup;
private EnergyPortalSubGroups singleSubGroup;
private BillingPeriod singlePeriod;
private DateTime[] dateTimeArray;

private void parseGroup(EnergyPortalGroup superGroup) throws InterruptedException{
EnergyPortalSubGroupsCriteria criteria = new EnergyPortalSubGroupsCriteria();
criteria.setGroupId(superGroup.getId());
List<EnergyPortalSubGroups> wholeSubGroupList = subgroupsFactory.readList(criteria);
for (EnergyPortalSubGroups singleSubGroup : wholeSubGroupList){
this.singleSubGroup = singleSubGroup;
this.deleteSubGroupRecordsFromDB(singleSubGroup);
List<BillingPeriod> billingPeriodList = this.getPreviousTwelveBillingPeriods(singleSubGroup, superGroup);
if (billingPeriodList != null && billingPeriodList.size() > 0){
Thread[] threads = new Thread[billingPeriodList.size()];
for (int i = 0; i < billingPeriodList.size(); i++){
this.singlePeriod = billingPeriodList.get(i);
threads[i] = new Thread(this);
threads[i].start();
}
for (Thread thread : threads){
thread.join();
}
}
}
}

这是我重写的运行方法:

@Override
public void run(){
List<GroupSummarization> groupSummarizationsToWriteList = new ArrayList<>();
WidgetDataSummationHolder holder = new WidgetDataSummationHolder();
holder = energyPortalService.getEnergyPortalWidgetsSummedData(singleSubGroup, null, null, singlePeriod);
parseSummationHolder(groupSummarizationsToWriteList, holder, singleSubGroup, dateTimeArray, singlePeriod);
processBatchLists(groupSummarizationsToWriteList, superGroup, singlePeriod);
}

任何人都可以帮助我确保该线程安全吗?我显然是多线程新手,我尝试使用构造函数传递这些变量,但我有一些为空的 Autowiring 服务,并且我在这一行得到一个空指针 holder = energyPortalService.getEnergyPortalWidgetsSummedData(singleSubGroup, null, null, singlePeriod);

最佳答案

根据您提供的代码,energyPortalService 有时不能为 null,有时则不能为 null。如果当你启动一个新的线程(this)时它不为空,那么如果你要使用一个新的线程(()-> {...});

(既然你正在谈论 Autowiring ,我会假设 osgi 和 aop 以及此类邪恶行为可能会发生很多错误。)

关于java - 带参数的 for 循环中的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49821472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com