在Java中使用两个线程按顺序打印ArrayList
下面的代码是一个糟糕的编码示例,我们如何改进它?请帮助我理解它 问题:使用两个线程按顺序打印ArrayList 我的代码:-在Java中使用两个线程按顺序打印ArrayList,java,multithreading,Java,Multithreading,下面的代码是一个糟糕的编码示例,我们如何改进它?请帮助我理解它 问题:使用两个线程按顺序打印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
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();
}
}
公共类xyz{
公共静态void main(字符串[]args)引发InterruptedException{
ArrayList list1=新的ArrayList(Arrays.asList(1,2,3,4,5,6,7,8,9,10));
线程奇数=新线程(()->{
对于(int i=0;i{
for(int i=1;i
结果-
单数:1
偶数:2
单数:3
偶数:4
单数:5
偶数:6
单数:7
偶数:8
单数:9
偶数:10这是一个糟糕的编码,因为它使用多个线程按顺序执行某些操作。。。除此之外 弹出的内容是
wait
不在while
循环中。始终(几乎)将wait
置于while
循环中。如果你有谷歌的话,可能会有很好的参考资料——我还是会选择Doug Lea上个世纪的Java第二版并发编程
使用java.util.concurrent
,可能有更好的方法来实现这一点——请参见java并发性实践
您需要某种共享状态来指示应该执行哪个线程。检查您的while
状态
我注意到它正在从锁的外部调用size
。虽然这可能没问题,但您正在调用的是一个非线程安全的可变对象
真正可怕的是大部分代码都是重复的。这是糟糕的编码,因为它使用多个线程按顺序执行某些操作。。。除此之外 弹出的内容是
wait
不在while
循环中。始终(几乎)将wait
置于while
循环中。如果你有谷歌的话,可能会有很好的参考资料——我还是会选择Doug Lea上个世纪的Java第二版并发编程
使用java.util.concurrent
,可能有更好的方法来实现这一点——请参见java并发性实践
您需要某种共享状态来指示应该执行哪个线程。检查您的while
状态
我注意到它正在从锁的外部调用size
。虽然这可能没问题,但您正在调用的是一个非线程安全的可变对象
真正可怕的是大部分代码都是重复的。很可能会先开始,但也不能保证偶数不能先到达同步的代码。也许如果你运行它几百次,你会看到竞争条件。你的等待/通知循环的工作方式,你总是有一个线程等待。因此,你的程序永远不会结束。零星的东西会先开始,但不能保证偶数不会先到达同步的。也许如果你运行它几百次,你会看到竞争条件。你的等待/通知循环的工作方式,你总是有一个线程等待。因此你的计划永远不会结束。