Java-从多个线程写入共享数组
有一个问题叫做“1717”。这听起来很简单,但我无法理解算法。以下是问题简介: 编写一个并发Java程序,声明一个由10个整数组成的数组。创建两个线程。一种将值1写入数组中每个元素的方法。第二个线程将值7写入数组的每个元素。当两个线程都终止时,打印出数组。 两个线程终止时的结果必须为(1,7,1,7,1,7,1,…)或(7,1,7,1,7,…)。您需要使用synchronized方法或synchronized语句来实现这一点。注意,每个线程必须写入数组的每个元素 此外,我被告知,每个线程应该只向每个元素写入一次 这是我的。我需要一个在run()方法中满足这一点的算法。任何帮助都将不胜感激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语句来实现这一点。注意,每个线程必须写入数组的每个元素 此外,我被告知,每个线程应该只向
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
试试:
a[0]=7
a[0]=1
,a[1]=1
a[1]=7
,a[2]=7
a[2]=1
,a[3]=1
您可以为每个线程T1和T7运行两次:
- 在第一次运行时,只允许线程T1在数组的偶数索引上写入,T7在数组的奇数索引上写入李>
- 在第二次运行时,您将执行相反的操作:T1写入奇数索引,T7写入偶数索引