[英]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.