Multithreading RxJava和多线程变量
下面的代码仅用于演示目的。这不是开发代码,所以请不要批评“坏习惯”。它只是用来传达概念的 假设您在一个方法中,有一个空列表Multithreading RxJava和多线程变量,multithreading,scope,rx-java,rx-java2,race-condition,Multithreading,Scope,Rx Java,Rx Java2,Race Condition,下面的代码仅用于演示目的。这不是开发代码,所以请不要批评“坏习惯”。它只是用来传达概念的 假设您在一个方法中,有一个空列表 public void myMethod() { List<Strings> myList = new ArrayList<>(); } 但是,如果我们也这样做,但是从主线程访问它,它就会工作 Thread.wait(5000); RunOnMainThread { //--> This can be done any number
public void myMethod() {
List<Strings> myList = new ArrayList<>();
}
但是,如果我们也这样做,但是从主线程访问它,它就会工作
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
}
}
public void myMethod(){
List myList=new ArrayList();
getMyStuff.subOn(Schedulers.io()).obsOn(AndroidSchedulers.mainThread()).sub(新回调(){
@凌驾
公用电话(列表){
myList.addAll(列表);
}
})
线程。等待(5000);
runnonmainthread{/-->这可以通过多种方式完成。
Assert.true(myList.size()>0)-->true
}
}
我在其他案例中也看到过类似的情况,但我不知道为什么。这是因为每个线程都有自己的堆栈/内存区域吗?我很惊讶,你没有收到编译器警告说myList超出了范围。它应该声明为静态或移动到类范围。由于对sub的调用是异步的,因此响应将到达myMethod范围之外的另一个线程 有趣!所以,如果这是一个类变量,那么使用“volatile”能解决这个问题吗?这就引出了我这边的一个问题。这不全是运气吗?主线程是一个循环线程,这意味着它可能不会立即执行,对吗?一旦工作运行,列表就初始化了,这不是巧合吗?感谢这是因为您更新了主线程上的
myList
,然后在延迟一段时间后安排主线程上的大小检查。如果您遵循这些步骤,这很容易重复。“仅用于演示目的”这样人们就不会抱怨不好的做法,以为我在使用计时器来处理异步行为。等等,这里有一个List myList=null
,但没有List=new ArrayList()
或等效项。。。我知道这只是一个演示,但是。。
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
}
}