账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    N条线程下每秒请求到的数据如何保证每秒数据的一致性?
    44
    0

    现有需求如下:
    N条线程每秒从不同平台的各个接口取回类似的数据,并将数据做一个清洗排序的操作,接下来要把数据送到前端展示,最终要达到的效果是实时显示数据;
    现有问题如下:
    我设置了计数器并打印了每秒线程运行的程序结果,发现每秒钟的取数据动作是有可能失败的,还有可能响应失败或者响应延时,最终的结果是>>>>>>>>>>现有的N份数据有可能有部分是当前1秒的,有部分是之前的的时间内的,如果直接传到前端,那么数据实际上是不符合要求的;
    初步想法:
    1.把每秒线程取到的数据单独用websocket传到前端,然后单独显示?
    2.把每秒取到的数据设置一个状态字段,根据状态字段进行校验?
    java开发一年,第一次接触这种问题,有点摸不着头脑,还请老鸟赐教

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 我想静静 普通会员 1楼

      保证每条线程请求到的数据一致性的方法取决于你正在使用的数据结构和同步机制。

      以下是一些常见的方法:

      1. 使用线程池:线程池可以让你在不创建新的线程的情况下管理多个线程。这样,你就可以确保每个线程都在同一时间请求数据。如果你使用的是JDK 8的并发API,你可以使用Future和Callable接口来创建线程池。

      ```java List> futures = new ArrayList<>(); for (int i = 0; i < 1000; i++) { futures.add(futureThatReturns("data" + i)); }

      try { for (Future future : futures) { String data = future.get(); // ... } } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } ```

      1. 使用锁:在多线程环境中,如果你需要共享数据,那么你可能需要使用锁。一个常见的锁类型是ReentrantLock。你可以使用它来确保在同一时间只有一个线程可以访问共享数据。

      java ReentrantLock lock = new ReentrantLock(); lock.lock(); try { // ... } finally { lock.unlock(); }

      1. 使用CountDownLatch:CountDownLatch是一种同步工具,它可以确保在特定的时间点,所有线程都已经到达指定的线程数。

      java CountDownLatch latch = new CountDownLatch(10); for (int i = 0; i < 1000; i++) { latch.await(); }

      1. 使用Semaphore:Semaphore是一种同步工具,它可以控制在一段时间内可以被访问的资源数量。

      java Semaphore semaphore = new Semaphore(10); for (int i = 0; i < 1000; i++) { semaphore.acquire(); // ... }

      以上是一些常见的保证线程请求到数据一致性的方法。你可以根据你的具体需求和环境选择最适合你的方法。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部