[英]Update form real-time when data is concurrently updated in Java
假设我有一些类似于以下数据的数据存储在数组(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)来做到这一点,我也将不胜感激。
您必须在方法上使用“已同步”语句,否则必须保存用户更改。 它通过仅允许一个用户执行整个同步块直到完成,来控制对代码的访问。
这里是一些示例的文档链接。
https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html
我假设:
话虽如此,您可以简单地使用一个共享的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();
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.