gpt4 book ai didi

java - 如何在 java 7 中使用 Executor Service 并拥有多个可运行对象

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

我真的很难实现这个。我最近学习了多线程并开始使用执行器服务异步运行作业。

我这里有这样的情况:

final ArrayList<String> sList = new ArrayList<String>();
final ArrayList<String> gList = new ArrayList<String>();
final JSONArray stateId = [JSON ARRAY WITH JSON DATA]
//ExecutorService exec = new FixedThreadPoll(10);
for(String sId : stateId){
for(String sItem : sList){
for(String gItem: gList){
//do an API call
lisA.add(somthing);
}
}
}

接下来我需要迭代该列表并在其中创建另一个列表。

for(String a : listA){
for(String sItem : sList){
for(String gItem: gList){
//do an API call
lisB.add(somthing);
}
}
}

我想在此处使用执行程序服务进行循环,并通过异步运行循环来减少执行时间。但我无法做到这一点。我尝试了以下方法:

ExecutorService exec = new FixedThreadPoll(10);
for(String sId : stateId){
executor.execute(new Runnable() {
@Override
public void run() {
for(String sItem : sList){
for(String gItem: gList){
//do an API call
lisA.add(somthing);
}
}
});
}

我必须将一些变量设置为final,但我不能这样做,因为每次在循环中都需要分配该值,否则我会收到以下错误:”无法引用封闭范围内定义的非最终局部变量 gList”。

任何人都可以帮我解决如何在两个循环中使用 Executor 服务来完成这项任务吗?花了很多时间。我理解这个概念,但在实现时遇到困难。

最佳答案

需要注意的重要一点是,您在 Runnable外部定义的每个变量都在 Runnable内部使用 必须是最终的。

public static void main(String... args) throws Exception {
final ExecutorService exec = Executors.newFixedThreadPool(10);
final ArrayList<String> sList = new ArrayList<String>();
final ArrayList<String> gList = new ArrayList<String>();
final List<String> stateId = new ArrayList<>();
final ArrayList<String> lisA = new ArrayList<>();

for(final String sId : stateId) {
exec.execute(new Runnable() {
@Override
public void run() {
for (String sItem : sList) {
for (String gItem : gList) {
//do an API call
lisA.add(sId);
}
}
}
});
}
}

如果您有一个不能是final的变量,但您仍然需要在可运行对象中使用它,则可以声明一个新的final变量,该变量设置为等于非final变量:

public static void main(String... args) throws Exception {
final ExecutorService exec = Executors.newFixedThreadPool(10);
final ArrayList<String> sList = new ArrayList<String>();
final ArrayList<String> gList = new ArrayList<String>();
final List<String> stateId = new ArrayList<>();
final ArrayList<String> lisA = new ArrayList<>();

// sId is non-final
for(String sId : stateId) {
// f_sId is final; it will be sId's current value
final String f_sId = sId;
exec.execute(new Runnable() {
@Override
public void run() {
for (String sItem : sList) {
for (String gItem : gList) {
//do an API call
lisA.add(f_sId);
}
}
}
});
}
}

关于java - 如何在 java 7 中使用 Executor Service 并拥有多个可运行对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45449079/

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