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

时间:2016-02-02 16:07:03

标签: java multithreading concurrency synchronization

这个问题叫做" 1717171717"。这听起来很简单,但我无法理解算法。以下是问题简报:

编写一个并发Java程序,声明一个包含10个整数的数组。创建两个线程。一个将值1写入数组中的每个元素。第二个线程将值7写入数组的每个元素。当两个线程都已终止时,打印出阵列。 两个线程终止时的结果必须是(1,7,1,7,1,7,1,7,...)或(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.");
    }
}

2 个答案:

答案 0 :(得分:0)

尝试:

  1. t1写a[0] = 7
  2. t2写a[0] = 1a[1] = 1
  3. t1写a[1] = 7a[2] = 7
  4. t2写a[2] = 1a[3] = 1
  5. ...

答案 1 :(得分:0)

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

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