android.os.Handler类是否消除了将某些方法声明为synchronized的需要?

scr*_*pse 5 java multithreading android synchronized handler

在组合一个简单的"时钟"应用程序时,我发现Android要求你使用生活在线程A中的android.os.Handler来更新线程A中的View对象,其中包含来自线程B的数据结果.

我还是比较新的Java,这是我以前第一次明确处理Threads,但我知道如果两个不同的线程想要访问相同的数据,通常会将方法和/或操作声明为synchronized .但是看起来android.os.Handler是一种特定于Android的线程之间同步数据的方式,这样你就可以避免我刚刚链接到的Oracle文档中详述的经典 并发错误.这是真的吗?

如果我发现自己的情况是Android操作系统要求我使用android.os.Handler将数据从一个线程传送到另一个线程,这是否意味着我不必声明用于派生该方法的方法数据同步?

Nic*_*ion 11

我的理解:

一个处理器仅仅是两个线程之间传递信息的一种机制.它不是唯一的机制,但它是Google选择用于向活动中添加易于使用的方法来执行常见任务的机制.

来自doc

为应用程序创建进程时,其主线程专用于运行消息队列,该队列负责管理顶级应用程序对象(活动,广播接收器等)及其创建的任何窗口.您可以创建自己的线程,并通过Handler与主应用程序线程进行通信.这是通过调用与以前相同的post或sendMessage方法完成的,但是来自您的新线程.然后,将在Handler的消息队列中调度给定的Runnable或Message,并在适当时进行处理.

主线程正在运行一个Handler.处理程序负责运行您的活动和管理应用程序环境.Handler只是一个消息循环,它从MessageQueue调度事物.这就是你的线程必须运行Looper来创建一个Handler的原因.要同步您要执行此操作的其他内容,您必须将请求插入此消息队列,以便主应用程序线程完成您的工作.只要只有一个线程访问对象,它就会被编写,它起作用.

我想这一点是要指出Handler是一种进行同步的机制.当然,MessageQueue的内部编写是为了将同步考虑在内,尽管它的大致简化是说"如果多个线程访问它,它需要同步".尽管UI是最常见的示例,但使用Handler和Looper只是一种设计多线程应用程序的机制,该应用程序为事件处理提供单线程同步.

是否需要同步发送给Handler的内容在很大程度上取决于您发送的内容.如果你正在讨论同步调用post东西,那么不,处理程序会处理这个问题.如果您正在讨论发布到Handler的Runnable中的代码,请意识到Handler的唯一保证是使用创建Handler的线程执行runnable.您需要继续提供与其他资源的同步.