Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用两个线程按顺序打印ArrayList_Java_Multithreading - Fatal编程技术网

在Java中使用两个线程按顺序打印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

下面的代码是一个糟糕的编码示例,我们如何改进它?请帮助我理解它

问题:使用两个线程按顺序打印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();
    }
}
公共类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
。虽然这可能没问题,但您正在调用的是一个非线程安全的可变对象


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

很可能会先开始,但也不能保证偶数不能先到达同步的代码。也许如果你运行它几百次,你会看到竞争条件。你的等待/通知循环的工作方式,你总是有一个线程等待。因此,你的程序永远不会结束。零星的东西会先开始,但不能保证偶数不会先到达同步的。也许如果你运行它几百次,你会看到竞争条件。你的等待/通知循环的工作方式,你总是有一个线程等待。因此你的计划永远不会结束。