Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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-从多个线程写入共享数组_Java_Multithreading_Concurrency_Synchronization - Fatal编程技术网

Java-从多个线程写入共享数组

Java-从多个线程写入共享数组,java,multithreading,concurrency,synchronization,Java,Multithreading,Concurrency,Synchronization,有一个问题叫做“1717”。这听起来很简单,但我无法理解算法。以下是问题简介: 编写一个并发Java程序,声明一个由10个整数组成的数组。创建两个线程。一种将值1写入数组中每个元素的方法。第二个线程将值7写入数组的每个元素。当两个线程都终止时,打印出数组。 两个线程终止时的结果必须为(1,7,1,7,1,7,1,…)或(7,1,7,1,7,…)。您需要使用synchronized方法或synchronized语句来实现这一点。注意,每个线程必须写入数组的每个元素 此外,我被告知,每个线程应该只向

有一个问题叫做“1717”。这听起来很简单,但我无法理解算法。以下是问题简介:

编写一个并发Java程序,声明一个由10个整数组成的数组。创建两个线程。一种将值1写入数组中每个元素的方法。第二个线程将值7写入数组的每个元素。当两个线程都终止时,打印出数组。 两个线程终止时的结果必须为(1,7,1,7,1,7,1,…)或(7,1,7,1,7,…)。您需要使用synchronized方法或synchronized语句来实现这一点。注意,每个线程必须写入数组的每个元素

此外,我被告知,每个线程应该只向每个元素写入一次

这是我的。我需要一个在run()方法中满足这一点的算法。任何帮助都将不胜感激

import java.util.ArrayList;

class SharedData
{   
    public static void main(String[] args) throws InterruptedException
    {
        ArrayList<Integer> data = new ArrayList<>(10);
        for (int i = 0; i < 10; i++)
            data.add(0);
        Writer.array = data;

        Thread one = new Thread (new Writer(1), "Ones");
        Thread seven = new Thread (new Writer(7), "Sevens");
        one.start();
        seven.start();
        one.join(); seven.join();
        data.forEach(System.out::println);
    }
}

class Writer implements Runnable
{
    public static ArrayList<Integer> array = new ArrayList<>();
    final int value;
    Writer (int val) {
        this.value = val;
    }

    public void run()
    {
        for (int i = 0; i < array.size(); i++) {
            synchronized (array) {
                try
                {
                    //Algorithm?
                    array.set(i, value);

                    array.notifyAll();
                    if (i < array.size()-1)
                        array.wait();
                }
                catch (InterruptedException ie) {
                    System.err.println(ie.getMessage());
                }
            }
        }
        System.out.println(Thread.currentThread().getName()+" terminated.");
    }
}
import java.util.ArrayList;
类共享数据
{   
公共静态void main(字符串[]args)引发InterruptedException
{
ArrayList数据=新的ArrayList(10);
对于(int i=0;i<10;i++)
数据。添加(0);
Writer.array=数据;
线程1=新线程(新写入程序(1),“1”);
线程七=新线程(新写入器(7),“七”);
一、启动();
七、开始;
一、连接;七、连接;
data.forEach(System.out::println);
}
}
类编写器实现可运行的
{
公共静态ArrayList数组=新建ArrayList();
最终整数值;
编写器(int-val){
this.value=val;
}
公开募捐
{
对于(int i=0;i
试试:

  • t1写入
    a[0]=7
  • t2写入
    a[0]=1
    a[1]=1
  • t1写入
    a[1]=7
    a[2]=7
  • t2写入
    a[2]=1
    a[3]=1

  • 您可以为每个线程T1和T7运行两次:

    • 在第一次运行时,只允许线程T1在数组的偶数索引上写入,T7在数组的奇数索引上写入
    • 在第二次运行时,您将执行相反的操作:T1写入奇数索引,T7写入偶数索引

    我可以问一下为什么我的问题得到这么多反对票吗?你应该使用数组,而不是数组列表。@assylias,你说得对。。。不需要在这里之前发生。确切地说,它将在第二次运行结束时写入。。。在第一场比赛中,T1通过了平局,T7胜负悬殊;在第二场比赛中,他们将切换,T1将通过赔率,T7通过平局。这样,它们都会写入数组中的每个元素。@AndyTurner可能不是最有效的解决方案…:/@aribeiro使用2个线程填充10个元素的数组不是一个有效的解决方案,句号。@AndyTurner-truestory!这是唯一符合要求的答案。尽管这个技巧实际上是在实现它!