繁体   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