gpt4 book ai didi

java - 使用 Runnable 多线程运行一个方法

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

在我的程序中,我想在其中一个方法中创建多个线程,其中每个线程必须使用给定的输入运行特定的方法。我使用 Runnable 编写了此代码片段。

class myClass {
public myClass() { }
public void doProcess() {
List< String >[] ls;
ls = new List[2]; // two lists in one array
ls[0].add("1"); ls[0].add("2"); ls[0].add("3");
ls[1].add("4"); ls[1].add("5"); ls[1].add("6");

// create two threads
Runnable[] t = new Runnable[2];
for (int i = 0; i < 2; i++) {
t[ i ] = new Runnable() {
public void run() {
pleasePrint( ls[i] );
}
};
new Thread( t[i] ).start();
}
}
void pleasePrint( List< String > ss )
{
for (int i = 0; i < ss.size(); i++) {
System.out.print(ss.get(i)); // print the elements of one list
}
}
}

public class Threadtest {
public static void main(String[] args) {
myClass mc = new myClass();
mc.doProcess();
}
}

请注意,我的大代码如下所示。我的意思是,在一种方法 doProcess() 中,我创建一个列表数组并将项目放入其中。然后我想创建线程并将每个列表传递给一个方法。可以将数组和列表定义为私有(private)类成员。但是,我想以这种方式做到这一点。

一切似乎都很正常,但是,我在调用 pleasePrint() 时收到此错误:

error: local variables referenced from an inner class must be final or effectively final
pleasePrint( ls[i] );

我该如何解决这个问题?

最佳答案

您收到此错误的原因很简单且明确提及 - 从内部类引用的局部变量必须是最终的或实际上最终的。反过来,这是因为语言规范是这么说的。

引用Guy Steele这里:

Actually, the prototype implementation did allow non-final variables to be referenced from within inner classes. There was an outcry from users, complaining that they did not want this! The reason was interesting: in order to support such variables, it was necessary to heap-allocate them, and (at that time, at least) the average Java programmer was still pretty skittish about heap allocation and garbage collection and all that. They disapproved of the language performing heap allocation "under the table" when there was no occurrence of the "new" keyword in sight.

就您的实现而言,我宁愿使用列表列表,而不是使用列表数组。

private final List<List<String>> mainList = new ArrayList<>();

您可以创建新列表并将其插入构造函数中的主列表中,具体取决于您想要的列表数量。

public ListOfLists(int noOfLists) {
this.noOfLists = noOfLists;
for (int i = 0; i < noOfLists; i++) {
mainList.add(new ArrayList<>());
}
}

然后您可以更改您的 doProcess() 方法,如下所示:

public void doProcess() {
for (int i = 0; i < noOfLists; i++) {
final int index = i;
// Using Lambda Expression as it is much cleaner
new Thread(() -> {
System.out.println(Thread.currentThread().getName());
pleasePrint(mainList.get(index)); // Pass each list for printing
}).start();
}
}

注意:我使用了一个名为 noOfLists 的实例变量来(顾名思义)存储我需要的列表数量。内容如下:

private final int noOfLists;

要填充列表,您可以执行以下操作:

mainList.get(0).add("1");
mainList.get(0).add("2");
mainList.get(0).add("3");
mainList.get(1).add("4");
mainList.get(1).add("5");
mainList.get(1).add("6");
// And so on...

你会得到如下输出:

Thread-0
1
2
3
Thread-1
4
5
6

希望这有帮助:)

关于java - 使用 Runnable 多线程运行一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44069194/

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