Java 在Android中,对象变量从一个线程到另一个线程不可见
我有两个线程访问同一个对象RestResource,t1线程调用RestResource.GetResource()方法,t2线程调用Msg变量。 t2线程无法查看更改或更新的Msg变量数据。请告知如何修复此问题。 请注意,线程t2正在启动线程t1并等待它完成作业Java 在Android中,对象变量从一个线程到另一个线程不可见,java,android,multithreading,thread-safety,Java,Android,Multithreading,Thread Safety,我有两个线程访问同一个对象RestResource,t1线程调用RestResource.GetResource()方法,t2线程调用Msg变量。 t2线程无法查看更改或更新的Msg变量数据。请告知如何修复此问题。 请注意,线程t2正在启动线程t1并等待它完成作业 public class RestResource() { public volatile String Msg; public void GetResource(){ List<Res
public class RestResource()
{
public volatile String Msg;
public void GetResource(){
List<Resource> remoteResourceList = GetRemoteResource(); // Getting List from Remote Server
for (Resource resource: remoteResourceList){
switch (resource.resourceType) {
case 0:
AA(); break;
case 1:
BB(); break;
case 2:
CC(); break;
case 3:
DD();break;
}
}
}
private void AA(){
Msg = "AA is executing";
}
private void BB(){
Msg = "BB is executing";
}
private void CC(){
Msg = "CC is executing";
}
private void DD(){
Msg = "DD is executing";
}
}
private volatile RestResource restResource = new RestResource(context);
protected void onCreate(Bundle savedInstanceState) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
_restResource.GetResource();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
t1.start();
while(progress<101){
UpdateUI(_restResource.Msg);
progress++;
}
}
t1.join();
});
}
公共类RestResource()
{
公共易失字符串Msg;
public void GetResource(){
List remoteResourceList=GetRemoteResource();//从远程服务器获取列表
for(资源:remoteResourceList){
开关(resource.resourceType){
案例0:
AA();断裂;
案例1:
BB();断裂;
案例2:
CC();断裂;
案例3:
DD();断裂;
}
}
}
私人机构{
Msg=“AA正在执行”;
}
私隐无效BB(){
Msg=“BB正在执行”;
}
私有无效CC(){
Msg=“CC正在执行”;
}
私有无效DD(){
Msg=“DD正在执行”;
}
}
private volatile RestResource RestResource=新RestResource(上下文);
创建时受保护的void(Bundle savedInstanceState){
线程t1=新线程(新的可运行线程(){
@凌驾
公开募捐{
_restResource.GetResource();
}
});
线程t2=新线程(新可运行(){
@凌驾
公开募捐{
t1.start();
while(进度)
t2线程在Msg变量数据更改或更新时无法看到它
实际上,Msg
字段是易变的。因此,对于访问该变量的任何线程,该变量的任何更改都是可见的。
您的问题是t2线程没有看到Msg
的更新,因为它的run()
方法不关心Msg
更新。
它仅用于将其传递给UpdateUI()
:
然后t2线程完成。
要能够在t2
中使用Msg
的新值,应允许t2
不完成,并在Msg
值更改时收到通知。
通过这种方式,它可以使用新值调用UpdateUI(_restResource.Msg);
请注意,这将起作用,但会添加额外的逻辑。
实际上,似乎没有必要使用线程来调用UpdateUI()
GetResource()
直接调用UpdateUI()
方法似乎更为自然。t2正在启动t1线程并循环&等待t1完成作业。所有方法都已执行,但UI仍显示AA正在执行..t2正在做更多的事情,因此我也需要t2。您的代码做了很多更改:)答案不再有意义了。请建议如何解决…)
UpdateUI(_restResource.Msg);