【EventBus】Subscribe 注解分析 ( Subscribe 注解属性 | threadMode 线程模型 | POSTING | MAIN | MAIN_ORDERED | ASYNC)

简介: 【EventBus】Subscribe 注解分析 ( Subscribe 注解属性 | threadMode 线程模型 | POSTING | MAIN | MAIN_ORDERED | ASYNC)

文章目录

一、Subscribe 注解属性

二、threadMode 线程模式 ( POSTING | MAIN | MAIN_ORDERED | BACKGROUND | ASYNC )





一、Subscribe 注解属性


查看 Subscribe 注解的源码 , 其中定义了 3 33 个注解属性 ;


threadMode 注解属性 用于配置 线程模式 , 用于标明执行事件对应的方法处于的线程类型 , 默认是 ThreadMode.POSTING 类型 ;


sticky 注解属性用于配置粘性事件 ;


priority 注解属性用于配置事件处理的优先级 , 如果要处理的事件分先后顺序时 , 需要使用优先级进行配置 ;


package org.greenrobot.eventbus;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Subscribe {
    ThreadMode threadMode() default ThreadMode.POSTING;
    /**
     * 如果为true,则将最近的粘性事件 (posted with
     * {@link EventBus#postSticky(Object)}) 传递到此订阅服务器(如果事件可用)。
     */
    boolean sticky() default false;
    /** 影响事件传递顺序的订户优先级。在同一传递线程({@link ThreadMode})中,
     * 优先级较高的订阅者将在其他优先级较低的订阅者之前接收事件。默认优先级为0。
     * 注意:优先级*不*影响具有不同{@link ThreadMode}的订阅服务器之间的传递顺序! */
    int priority() default 0;
}






二、threadMode 线程模式 ( POSTING | MAIN | MAIN_ORDERED | BACKGROUND | ASYNC )


发布线程 : 调用 EventBus.getDefault().post() 发布消息的线程 ;



ThreadMode 线程模式 : 有 5 55 个可设置项 , POSTING , MAIN , MAIN_ORDERED , BACKGROUND , ASYNC ;


POSTING 模式 : 默认的最小开销处理方式 , 不进行线程切换 , 在哪个线程发送事件 , 就在哪个线程处理事件 ;

如果使用该模式 , 不要处理耗时事件 , 否则会长时间阻塞发布事件的线程 ;

主线程发布消息 : 在主线程执行 ;

子线程发布消息 : 在子线程执行 ;

MAIN 模式 : 在主线程处理事件 , 如果在子线程发送消息 , 处理消息时会将线程切换成主线程 ;

如果发送事件的线程是 主线程 , 则立刻调用消息处理事件 , 此时 主线程会阻塞 ;

如果发送事件的线程是 子线程 , 事件在队列中排队等待传递 , 不会阻塞发布线程 ;

MAIN_ORDERED 模式 : 在主线程处理事件 ; 不管是在主线程还是在子线程发布事件 , 事件都在队列中排队等待传递 , 都不会阻塞发布线程 ;

BACKGROUND 模式 : 子线程模式 ;

在 主线程 中发布事件 , 会将事件加入队列中 , 然后 通过线程池执行 ;

在 子线程 中发布事件 , 直接在该线程中调用事件处理方法 , 会阻塞发布线程 ;

ASYNC 模式 : 不管在哪个线程发布事件 , 都会将放入队列 , 通过线程池执行事件 ;


下面是 ThreadMode 的详细源码及注释 :


package org.greenrobot.eventbus;
/**
 * 每个订户方法都有一个线程模式,该模式确定EventBus将在哪个线程中调用该方法。
 * EventBus独立于发布线程处理线程。
 *
 * @see EventBus#register(Object)
 * @author Markus
 */
public enum ThreadMode {
    /**
     * 订阅服务器将在发布事件的同一线程中直接调用。
     * 这是默认设置。
     * 事件传递意味着开销最小,因为它完全避免了线程切换。
     * 因此,对于已知可以在很短时间内完成而不需要主线程的简单任务,这是推荐的模式。
     * 使用此模式的事件处理程序必须快速返回,以避免阻塞发布线程(可能是主线程)。
     */
    POSTING,
    /**
     * 在Android上,订户将在Android的主线程(UI线程)中被调用。
     * 如果发布线程是主线程,则将直接调用订阅者方法,从而阻塞发布线程。
     * 否则,事件将排队等待传递(非阻塞)。使用此模式的订阅服务器必须快速返回以避免阻塞主线程。
     * 如果不在Android上,其行为与{@link#POSTING}相同。
     */
    MAIN,
    /**
     * 在Android上,订户将在Android的主线程(UI线程)中被调用。
     * 与{@link#MAIN}不同,事件将始终排队等待传递。这确保post调用是非阻塞的。
     */
    MAIN_ORDERED,
    /**
     * 在Android上,订阅者将在后台线程中被调用。
     * 如果发布线程不是主线程,则将在发布线程中直接调用订阅方方法。
     * 如果发布线程是主线程,EventBus将使用一个后台线程,该线程将按顺序传递其所有事件。
     * 使用此模式的订阅者应尝试快速返回,以避免阻塞后台线程。
     * 如果不在Android上,则始终使用后台线程。
     */
    BACKGROUND,
    /**
     * 订户将在单独的线程中被调用。
     * 这始终独立于发布线程和主线程。
     * 发布事件从不等待使用此模式的订阅服务器方法。
     * 如果订户方法的执行可能需要一些时间,例如网络访问,则订户方法应使用此模式。
     * 避免同时触发大量长时间运行的异步订阅服务器方法,以限制并发线程的数量。
     * EventBus使用线程池高效地重用已完成异步订户通知中的线程。
     */
    ASYNC
}
目录
相关文章
|
3月前
|
存储 NoSQL Redis
Redis 新版本引入多线程的利弊分析
【10月更文挑战第16天】Redis 新版本引入多线程是一个具有挑战性和机遇的改变。虽然多线程带来了一些潜在的问题和挑战,但也为 Redis 提供了进一步提升性能和扩展能力的可能性。在实际应用中,我们需要根据具体的需求和场景,综合评估多线程的利弊,谨慎地选择和使用 Redis 的新版本。同时,Redis 开发者也需要不断努力,优化和完善多线程机制,以提供更加稳定、高效和可靠的 Redis 服务。
84 1
|
3月前
线程CPU异常定位分析
【10月更文挑战第3天】 开发过程中会出现一些CPU异常升高的问题,想要定位到具体的位置就需要一系列的分析,记录一些分析手段。
93 0
|
1月前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
62 4
|
3月前
|
并行计算 JavaScript 前端开发
单线程模型
【10月更文挑战第15天】
|
3月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
28 1
|
4月前
|
消息中间件 存储 NoSQL
剖析 Redis List 消息队列的三种消费线程模型
Redis 列表(List)是一种简单的字符串列表,它的底层实现是一个双向链表。 生产环境,很多公司都将 Redis 列表应用于轻量级消息队列 。这篇文章,我们聊聊如何使用 List 命令实现消息队列的功能以及剖析消费者线程模型 。
115 20
剖析 Redis List 消息队列的三种消费线程模型
|
3月前
|
NoSQL Redis 数据库
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
本文解释了Redis为什么采用单线程模型,以及为什么Redis单线程模型的效率和速度依然可以非常高,主要原因包括Redis操作主要访问内存、核心操作简单、单线程避免了线程竞争开销,以及使用了IO多路复用机制epoll。
66 0
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
|
4月前
|
Python
5-5|python开启多线程入口必须在main,从python线程(而不是main线程)启动pyQt线程有什么坏处?...
5-5|python开启多线程入口必须在main,从python线程(而不是main线程)启动pyQt线程有什么坏处?...
|
3月前
|
安全 调度 C#
STA模型、同步上下文和多线程、异步调度
【10月更文挑战第19天】本文介绍了 STA 模型、同步上下文和多线程、异步调度的概念及其优缺点。STA 模型适用于单线程环境,确保资源访问的顺序性;同步上下文和多线程提高了程序的并发性和响应性,但增加了复杂性;异步调度提升了程序的响应性和资源利用率,但也带来了编程复杂性和错误处理的挑战。选择合适的模型需根据具体应用场景和需求进行权衡。
|
3月前
|
消息中间件 NoSQL 关系型数据库
【多线程-从零开始-捌】阻塞队列,消费者生产者模型
【多线程-从零开始-捌】阻塞队列,消费者生产者模型
41 0