假设我有一些类似以下内容的数据存储在一个数组(2D)中。我允许多个用户同时更新它,我想在表单或任何我可以这样做的东西上实时查看它,以查看实时更新。
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
26 27 28 29 30
31 32 33 34 35 有没有人能帮我用Java实现上面的任务?如果有另一种语言的好方法,比如Python,我也会很感激。
发布于 2016-05-09 07:44:49
您必须在保存用户更改的方法或块上使用'synchronized‘语句。它通过只允许一个用户执行整个同步块直到完成来控制对代码的访问。
这里有一个文档的链接,上面有一些例子。
https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html
发布于 2016-05-09 17:29:08
我假设:
话虽如此,您只需使用一个共享的int元素数组和一个跟踪其修订的共享AtomicLong即可。然后,您可以允许每个并发用户对数组进行更新,只需确保用户每次更新时AtomicLong都会递增。
你可以让UI线程通过首先读取AtomicLong,然后读取数组内容来定期检查共享数据-周期的长度将由您想要保持的帧速率确定,但我认为30毫秒应该足够了。
由于AtomicLong的写入和读取之间存在先发制人的边缘,因此您肯定会看到线程内容正在更新。请注意,如果希望使用long数组,则需要确保对每个数组元素的写入将是原子的。
下面是使用一些虚拟代码快速说明该原理的示例:
import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.atomic.AtomicLong;
public class Playground {
private static AtomicLong REVISION = new AtomicLong(0);
private static int[] ARR = new int[10];
private static final int NUM_THREADS = 100;
private static final int NUM_UPDATES_PER_THREAD = 100;
public static void main(String[] args) {
new Thread(() -> {
int totalRevs = NUM_THREADS * NUM_UPDATES_PER_THREAD;
while (REVISION.get() < totalRevs) {
System.out.println(Arrays.toString(ARR));
try {
Thread.sleep(50);
} catch (Exception e) {}
}
}).start();
for (int i = 0; i < NUM_THREADS; ++i) {
final int iCopy = i;
new Thread(() -> {
for (int j = 0; j < NUM_UPDATES_PER_THREAD; ++j) {
Random rnd = new Random();
int sleepTime = rnd.nextInt(100);
try {
Thread.sleep(sleepTime);
} catch (Exception e) {}
int index = rnd.nextInt(10);
int value = rnd.nextInt();
ARR[index] = value;
REVISION.incrementAndGet();
}
}).start();
}
}
}https://stackoverflow.com/questions/37105910
复制相似问题