首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中并发更新数据时的实时更新表单

在Java中并发更新数据时的实时更新表单
EN

Stack Overflow用户
提问于 2016-05-09 07:28:27
回答 2查看 465关注 0票数 2

假设我有一些类似以下内容的数据存储在一个数组(2D)中。我允许多个用户同时更新它,我想在表单或任何我可以这样做的东西上实时查看它,以查看实时更新。

代码语言:javascript
复制
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,我也会很感激。

EN

回答 2

Stack Overflow用户

发布于 2016-05-09 07:44:49

您必须在保存用户更改的方法或块上使用'synchronized‘语句。它通过只允许一个用户执行整个同步块直到完成来控制对代码的访问。

这里有一个文档的链接,上面有一些例子。

https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

票数 0
EN

Stack Overflow用户

发布于 2016-05-09 17:29:08

我假设:

  • 您可以接受以数十milliseconds.
  • You为单位的预定义刷新率,也可以接受用户同时互相覆盖并丢失更新。
  • 您并不真正有兴趣从最终使用的解决方案中挤出每一分性能。
  • 如果不了解这些技术的内部工作原理并对其进行修改以满足新需求,您将无法针对不同的使用情形转换此处提供的技术。

话虽如此,您只需使用一个共享的int元素数组和一个跟踪其修订的共享AtomicLong即可。然后,您可以允许每个并发用户对数组进行更新,只需确保用户每次更新时AtomicLong都会递增。

你可以让UI线程通过首先读取AtomicLong,然后读取数组内容来定期检查共享数据-周期的长度将由您想要保持的帧速率确定,但我认为30毫秒应该足够了。

由于AtomicLong的写入和读取之间存在先发制人的边缘,因此您肯定会看到线程内容正在更新。请注意,如果希望使用long数组,则需要确保对每个数组元素的写入将是原子的。

下面是使用一些虚拟代码快速说明该原理的示例:

代码语言:javascript
复制
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();
      }
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37105910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档