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,所以引用不是最终的。