簡體   English   中英

在Java中同時更新數據時實時更新表單

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM