multithreading - RxJava和多线程变量

标签 multithreading scope rx-java rx-java2 race-condition

下面的代码仅用于演示目的。这不是开发代码,因此请不要批评“不良做法”。它只是在传达概念。

假设您在方法内,列表为空。

public void myMethod() {
  List<Strings> myList = new ArrayList<>(); 
} 

在myList定义的正下方,创建了一个多线程异步RX调用,并带有组合的回调以返回结果。让我们订阅 Schedulers.io(),并观察 AndroidSchedulers.mainThread()
getMyStuff.subOn(Schedulers.io()).obsOn(AndroidSchedulers.mainThread()).subscribe(new Callback(){
      @Override
      public void onDone(List<String> list){
          myList.addAll(list);
      }
})

如果我们在其下放置一个临时块,然后尝试访问myList,它将为 null。
Thread.wait(5000);

Assert.true(myList.size() > 0) --> False


但是,如果我们执行相同的操作,但是从线程访问它,则它将起作用。
Thread.wait(5000);

RunOnMainThread { //--> This can be done any number of ways.
  Assert.true(myList.size() > 0) --> True
}


整个工作代码看起来像
public void myMethod() {
  List<Strings> myList = new ArrayList<>();

  getMyStuff.subOn(Schedulers.io()).obsOn(AndroidSchedulers.mainThread()).sub(new Callback(){
      @Override
      public void onDone(List<String> list){
          myList.addAll(list);
      }
   })

  Thread.wait(5000);

  RunOnMainThread { //--> This can be done any number of ways.
     Assert.true(myList.size() > 0) --> True
  }
} 

我目睹了在其他情况下发生的类似情况,但是我迷失了原因。是否因为每个线程都有自己的内存堆栈/区域?

最佳答案

我很惊讶您没有收到编译器警告myList超出范围。应该将其声明为static或移至Class范围。由于对sub的调用是异步的,因此响应将到达myMethod范围之外的另一个线程。

关于multithreading - RxJava和多线程变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60534691/

相关文章:

java - 线程不可中断

Java - 停止 hibernate 线程

android - Realm DB Realm.asObservable() 发出结果两次

java - 取消订阅 Single 的正确方法是什么

c# - 在 C# 中同步共享资源集合

c++ - 长期运行时 CreateThread 失败

c# - 为什么我可以声明一个与父作用域中的变量同名的子变量?

C++ 初学者 Lambda 的

node.js - 模块中的 Node js 全局变量

android - RxSearchView 切换线程异常。在线等待