Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android中,对象变量从一个线程到另一个线程不可见_Java_Android_Multithreading_Thread Safety - Fatal编程技术网

Java 在Android中,对象变量从一个线程到另一个线程不可见

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

我有两个线程访问同一个对象RestResource,t1线程调用RestResource.GetResource()方法,t2线程调用Msg变量。 t2线程无法查看更改或更新的Msg变量数据。请告知如何修复此问题。 请注意,线程t2正在启动线程t1并等待它完成作业

    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);