gpt4 book ai didi

java - LinkedList 多线程在 Runnable 中创建单独的实例

转载 作者:行者123 更新时间:2023-12-01 07:39:14 24 4
gpt4 key购买 nike

说明我的问题的代码:

public class Linkedlisttest {
public static void main(String[] args) {
Linkedlisttest test = new Linkedlisttest();
test.go(args);
}
public void go(String[] args) {
int cpus = Runtime.getRuntime().availableProcessors();
ThreadPoolExecutor tpe = new ThreadPoolExecutor(cpus, cpus * 2, 1L,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
String numbersarray[] = {"one", "two", "three", "four", "five"};
LinkedList<String> numbers = new LinkedList(Arrays.asList(numbersarray));
for (int index = 0; index < 2; index++) {
tpe.execute(new removeNumbers(numbers, index));
}
}
class removeNumbers implements Runnable {
LinkedList<String> localnumbers;
int index;
public removeNumbers(LinkedList<String> localnumbers, int index) {
this.localnumbers = localnumbers;
this.index = index;
}
@Override
public void run() {
System.out.println(localnumbers.size() + " Thread#: " + index);
while (localnumbers.size() > 0) {
System.out.println(localnumbers.removeFirst() + " Thread#: " + index);
}
}
}
}

和输出(在哪个线程删除哪个元素方面有所不同):

5 Thread#: 0
5 Thread#: 1
one Thread#: 0
three Thread#: 0
four Thread#: 0
five Thread#: 0
two Thread#: 1

我期望 {"one", "two", "Three", "four", "Five"} 被删除两次,每个线程一次。但是,看起来 removeNumbers Runnables 共享相同的 localnumbers LinkedList。为什么会出现这种情况?我的理解是,我创建了两个单独的 localnumbers 实例,每个 removeNumbers Runnable 中有一个实例。

最佳答案

您正在传递对相同 LinkedList<String> 的引用到两个构造函数调用中,因此每个 localnumbers指向相同的 List 。这就是为什么两者都从同一个 List 中删除。 ,因为你还没有真正复制它。

你会想做一些类似的事情:

LinkedList<String> numbers = new LinkedList(Arrays.asList(numbersarray));
for (int index = 0; index < 2; index++) {
LinkedList<String> numbersCopy = new LinkedList<String>(numbers);
tpe.execute(new removeNumbers(numbersCopy, index));
}

有更有效的方法来制作这些副本。请注意,即使两次调用 Arrays.asList()使用相同的数组不足以真正创建副本,因为该方法返回 List由数组支持。您将需要创建 List 的副本如上面的循环所示,或者使用 System.arraycopy()在开头复制数组:

String[] numbersarray = {"one", "two", "three", "four", "five"};
String[] numbersarray2 = new String[numbersarray.length];
System.arraycopy(numbersarray, 0, numbersarray2, 0, numbersarray.length);

关于java - LinkedList 多线程在 Runnable 中创建单独的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7449502/

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