Java 另一个线程';在主线程上运行的代码是什么?

Java 另一个线程';在主线程上运行的代码是什么?,java,android,multithreading,heap-memory,android-handler,Java,Android,Multithreading,Heap Memory,Android Handler,最近,我被一些AndroidAPI弄糊涂了。这里有一些简单的解释,因为代码有点长,这是完全正确的,但只是让我困惑 我有两个线程:UI线程和另一个名为AThread的handler线程 mResponseHander是在UI线程中创建的处理程序,它显然与UI线程的循环器相关。然后我将mResponseHandler传递给AThread AThread是一个执行图像下载任务的HandlerThread。在AThread中,我编写了如下代码: mResponseHandler.post(new Run

最近,我被一些
Android
API弄糊涂了。这里有一些简单的解释,因为代码有点长,这是完全正确的,但只是让我困惑

我有两个线程:UI线程和另一个名为
AThread
handler线程

mResponseHander
是在UI线程中创建的
处理程序
,它显然与UI线程的循环器相关。然后我将
mResponseHandler
传递给
AThread

AThread
是一个执行图像下载任务的
HandlerThread
。在AThread
中,我编写了如下代码:

mResponseHandler.post(new Runnable() {
        @Override
        public void run() {

            if (mRequestMap.get(target) != url) {
                return;
            }

            mRequestMap.remove(target);
            mThumbnailDownloadListener.onThumbnailDownloaded(target, bitmap);
        }
    });
此外,变量
mRequestMap
mthumbnaildownloadstener
以及其他变量仅在
AThread
中定义

我知道当我调用
mResponseHandler.post(new Runnable)
时,
Runnable
稍后将在UI线程上运行,因为
mResponseHandler
与UI线程的循环器相关联

问题是:当变量
mRequestMap
mthumbnaildownloadstener
以及其他变量未在UI线程中定义,而仅在
AThread
中定义时,为什么上面在UI线程中运行的代码仍然正确

当变量“mRequestMap”和“mthumbnaildownloadstener”以及其他变量未在UI线程中定义,而仅在AThread中定义时,为什么上面在UI线程中运行的代码仍然正确

任何类实例(让我们进一步使用“object”)都驻留在
JVM
堆中(而不是“在线程中”或其他任何地方)。应用
新的
运算符时

Type variableName = new Type();
在堆上分配一段内存,对内存的引用存储为
variableName
的值。从现在起,任何对象(例如
线程
对象或实现
可运行
的对象,如您的情况)都可以对
类型
对象进行引用(
变量名
或其副本),“操作”它

也就是说,通过将
Runnable
发布到与UI线程的
循环器相关联的处理程序中,您可以告诉线程应该对堆中的对象执行哪些任务,这些对象可以被
mRequestMap
mthumbnaildownloadstener
引用


作为参考:。

这可能不对。
mRequestMap
mThumbnailDownloadListener
是线程安全的,它们的引用是最终的吗?是的,我认为它是线程安全的。因为mRequestMap是ConcurrentMap,所以引用不是最终的。