这个问题叫做" 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.");
}
}
答案 0 :(得分:0)
尝试:
a[0] = 7
a[0] = 1
,a[1] = 1
a[1] = 7
,a[2] = 7
a[2] = 1
,a[3] = 1
答案 1 :(得分:0)
您可以为每个线程T1和T7执行两次运行: