gpt4 book ai didi

java - 在Java中使用两个线程顺序打印ArrayList

转载 作者:行者123 更新时间:2023-12-01 19:33:14 26 4
gpt4 key购买 nike

下面的代码是错误编码的示例,我们如何改进它?请帮助我理解它。

问题:使用两个线程顺序打印 ArrayList

我的代码:-

public class xyz {

public static void main(String[] args) throws InterruptedException {

ArrayList<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));

Thread odd = new Thread(() -> {
for (int i = 0; i < list1.size(); i = i + 2) {
synchronized (list1) {
System.out.println(Thread.currentThread().getName() + " : " + list1.get(i));
list1.notifyAll();
try {
list1.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});

Thread even = new Thread(() -> {
for (int i = 1; i < list1.size(); i = i + 2) {
synchronized (list1) {
System.out.println(Thread.currentThread().getName() + " : " + list1.get(i));
list1.notifyAll();
try {
list1.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});

odd.setName("Odd");
even.setName("Even");

odd.start();
even.start();

odd.join();
even.join();
}
}

结果 -

奇数:1偶数:2奇数:3偶数:4奇数:5偶数:6奇数 : 7偶数:8奇数 : 9偶数:10

最佳答案

这是糟糕的编码,因为它使用多个线程顺序执行某些操作......除此之外。

弹出的结果是 wait 不在 while 循环中。总是(几乎)将 wait 放入 while 循环中。如果你有谷歌的话,可能有很好的引用资料 - 我仍然会去寻找上世纪 Doug Lea 的Java 并发编程第二版

使用 java.util.concurrent 可能有更好的方法来实现此目的 - 请参阅Java 并发实践

您将需要某种共享状态来指示应执行哪个线程。检查您的 while 条件。

我注意到它正在从锁外部调用size。虽然这可能没问题,但您正在调用的是一个非线程安全的可变对象。

真正可怕的是大部分代码都是重复的。

关于java - 在Java中使用两个线程顺序打印ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58878396/

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