最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中的三種應(yīng)用事件處理機(jī)制詳解

 更新時(shí)間:2025年04月14日 08:27:21   作者:風(fēng)象南  
在項(xiàng)目開發(fā)中,組件間的松耦合設(shè)計(jì)至關(guān)重要,應(yīng)用事件處理機(jī)制作為觀察者模式的一種實(shí)現(xiàn),允許系統(tǒng)在保持模塊獨(dú)立性的同時(shí)實(shí)現(xiàn)組件間的通信,SpringBoot延續(xù)并增強(qiáng)了Spring框架的事件機(jī)制,提供了多種靈活的事件處理方式,本文給大家介紹了SpringBoot中的三種應(yīng)用事件處理機(jī)制

引言

在項(xiàng)目開發(fā)中,組件間的松耦合設(shè)計(jì)至關(guān)重要。應(yīng)用事件處理機(jī)制作為觀察者模式的一種實(shí)現(xiàn),允許系統(tǒng)在保持模塊獨(dú)立性的同時(shí)實(shí)現(xiàn)組件間的通信。SpringBoot延續(xù)并增強(qiáng)了Spring框架的事件機(jī)制,提供了多種靈活的事件處理方式,使開發(fā)者能夠高效地實(shí)現(xiàn)系統(tǒng)內(nèi)的消息通知和狀態(tài)變更處理。

事件驅(qū)動(dòng)架構(gòu)的優(yōu)勢(shì)在于提高了系統(tǒng)的可擴(kuò)展性和可維護(hù)性。當(dāng)一個(gè)動(dòng)作觸發(fā)后,相關(guān)的事件被發(fā)布,而不同的監(jiān)聽(tīng)器可以根據(jù)自身需求響應(yīng)這些事件,彼此之間互不干擾。這種松耦合的設(shè)計(jì)允許我們?cè)诓恍薷囊延写a的前提下為系統(tǒng)添加新功能。

一、Spring事件機(jī)制基本概念

在深入各種事件處理機(jī)制之前,有必要了解Spring事件機(jī)制的幾個(gè)核心組件:

  • 應(yīng)用事件(ApplicationEvent) :表示發(fā)生在應(yīng)用中的事件,是所有自定義事件的基類
  • 事件發(fā)布者(ApplicationEventPublisher) :負(fù)責(zé)將事件發(fā)布到系統(tǒng)中
  • 事件監(jiān)聽(tīng)器(ApplicationListener) :監(jiān)聽(tīng)特定類型的事件并作出響應(yīng)

Spring提供了一種內(nèi)置的事件通知機(jī)制,事件可以從一個(gè)Spring Bean發(fā)送到另一個(gè)Bean,而不需要它們直接引用彼此,從而實(shí)現(xiàn)松耦合。在SpringBoot中,這種機(jī)制進(jìn)一步簡(jiǎn)化和增強(qiáng),使得事件處理更加便捷和強(qiáng)大。

二、方法一:基于ApplicationListener接口的事件監(jiān)聽(tīng)

1. 基本原理

這是Spring框架中最傳統(tǒng)的事件處理方式。通過(guò)實(shí)現(xiàn)ApplicationListener接口,可以創(chuàng)建能夠響應(yīng)特定事件類型的監(jiān)聽(tīng)器。當(dāng)匹配的事件被發(fā)布時(shí),監(jiān)聽(tīng)器的onApplicationEvent方法會(huì)被自動(dòng)調(diào)用。

2. 實(shí)現(xiàn)步驟

2.1 自定義事件

首先,我們需要?jiǎng)?chuàng)建一個(gè)自定義事件類,繼承ApplicationEvent:

public class UserRegisteredEvent extends ApplicationEvent {
    
    private final String username;
    
    public UserRegisteredEvent(Object source, String username) {
        super(source);
        this.username = username;
    }
    
    public String getUsername() {
        return username;
    }
}

2.2 創(chuàng)建事件監(jiān)聽(tīng)器

實(shí)現(xiàn)ApplicationListener接口,指定要監(jiān)聽(tīng)的事件類型:

@Component
public class UserRegistrationListener implements ApplicationListener<UserRegisteredEvent> {
    
    private static final Logger logger = LoggerFactory.getLogger(UserRegistrationListener.class);
    
    @Override
    public void onApplicationEvent(UserRegisteredEvent event) {
        logger.info("新用戶注冊(cè): {}, 事件來(lái)源: {}", 
                event.getUsername(), event.getSource().toString());
        
        // 處理業(yè)務(wù)邏輯,如發(fā)送歡迎郵件等
        sendWelcomeEmail(event.getUsername());
    }
    
    private void sendWelcomeEmail(String username) {
        // 郵件發(fā)送邏輯
        logger.info("向用戶 {} 發(fā)送歡迎郵件", username);
    }
}

2.3 發(fā)布事件

使用ApplicationEventPublisher來(lái)發(fā)布事件:

@Service
public class UserService {
    
    private final ApplicationEventPublisher eventPublisher;
    
    @Autowired
    public UserService(ApplicationEventPublisher eventPublisher) {
        this.eventPublisher = eventPublisher;
    }
    
    public void registerUser(String username, String password) {
        // 用戶注冊(cè)業(yè)務(wù)邏輯
        logger.info("注冊(cè)用戶: {}", username);
        
        // 注冊(cè)成功后,發(fā)布事件
        eventPublisher.publishEvent(new UserRegisteredEvent(this, username));
    }
}

3. 優(yōu)缺點(diǎn)分析

優(yōu)點(diǎn)

  • 類型安全,編譯器可以檢測(cè)到類型不匹配的問(wèn)題
  • 結(jié)構(gòu)清晰,監(jiān)聽(tīng)器與事件的關(guān)系明確
  • 符合面向接口編程的原則
  • 可以方便地實(shí)現(xiàn)泛型監(jiān)聽(tīng)器,處理一系列相關(guān)事件

缺點(diǎn)

  • 需要為每種事件創(chuàng)建一個(gè)監(jiān)聽(tīng)器類,當(dāng)事件類型多時(shí)代碼量大
  • 單一監(jiān)聽(tīng)器只能監(jiān)聽(tīng)一種類型的事件
  • 代碼較為冗長(zhǎng),需要實(shí)現(xiàn)接口并覆蓋方法
  • 配置相對(duì)繁瑣

4. 適用場(chǎng)景

  • 需要類型安全的事件處理
  • 監(jiān)聽(tīng)器邏輯復(fù)雜,需要良好封裝的場(chǎng)景
  • 已有的Spring框架遷移項(xiàng)目
  • 需要處理框架內(nèi)置事件如ContextRefreshedEvent等

三、方法二:基于@EventListener注解的事件監(jiān)聽(tīng)

1. 基本原理

從Spring 4.2開始,引入了基于注解的事件監(jiān)聽(tīng)機(jī)制,通過(guò)@EventListener注解可以將任何方法標(biāo)記為事件監(jiān)聽(tīng)器。這種方法簡(jiǎn)化了監(jiān)聽(tīng)器的創(chuàng)建,不再需要實(shí)現(xiàn)ApplicationListener接口。

2. 實(shí)現(xiàn)步驟

2.1 自定義事件

我們可以使用之前定義的UserRegisteredEvent,也可以創(chuàng)建更簡(jiǎn)單的事件對(duì)象,甚至可以是普通Java對(duì)象(POJO):

// 使用POJO作為事件對(duì)象
public class OrderCompletedEvent {
    
    private final String orderId;
    private final BigDecimal amount;
    
    public OrderCompletedEvent(String orderId, BigDecimal amount) {
        this.orderId = orderId;
        this.amount = amount;
    }
    
    // getters
    public String getOrderId() {
        return orderId;
    }
    
    public BigDecimal getAmount() {
        return amount;
    }
}

2.2 創(chuàng)建帶注解的監(jiān)聽(tīng)方法

在任何Spring Bean中,使用@EventListener注解標(biāo)記方法:

@Component
public class OrderEventHandler {
    
    private static final Logger logger = LoggerFactory.getLogger(OrderEventHandler.class);
    
    @EventListener
    public void handleOrderCompletedEvent(OrderCompletedEvent event) {
        logger.info("訂單完成: {}, 金額: {}", event.getOrderId(), event.getAmount());
        
        // 處理訂單完成后的業(yè)務(wù)邏輯
        updateInventory(event.getOrderId());
        notifyShipping(event.getOrderId());
    }
    
    // 也可以在同一個(gè)類中處理多種不同類型的事件
    @EventListener
    public void handleUserRegisteredEvent(UserRegisteredEvent event) {
        logger.info("檢測(cè)到新用戶注冊(cè): {}", event.getUsername());
        // 其他處理邏輯
    }
    
    private void updateInventory(String orderId) {
        // 更新庫(kù)存邏輯
        logger.info("更新訂單 {} 相關(guān)商品的庫(kù)存", orderId);
    }
    
    private void notifyShipping(String orderId) {
        // 通知物流部門
        logger.info("通知物流部門處理訂單: {}", orderId);
    }
}

2.3 發(fā)布事件

同樣使用ApplicationEventPublisher來(lái)發(fā)布事件:

@Service
public class OrderService {
    
    private final ApplicationEventPublisher eventPublisher;
    
    @Autowired
    public OrderService(ApplicationEventPublisher eventPublisher) {
        this.eventPublisher = eventPublisher;
    }
    
    public void completeOrder(String orderId, BigDecimal amount) {
        // 訂單完成業(yè)務(wù)邏輯
        logger.info("完成訂單: {}, 金額: {}", orderId, amount);
        
        // 發(fā)布訂單完成事件
        eventPublisher.publishEvent(new OrderCompletedEvent(orderId, amount));
    }
}

2.4 條件事件監(jiān)聽(tīng)

@EventListener注解還支持SpEL表達(dá)式來(lái)進(jìn)行條件過(guò)濾:

@Component
public class LargeOrderHandler {
    
    private static final Logger logger = LoggerFactory.getLogger(LargeOrderHandler.class);
    
    // 只處理金額大于1000的訂單
    @EventListener(condition = "#event.amount.compareTo(T(java.math.BigDecimal).valueOf(1000)) > 0")
    public void handleLargeOrder(OrderCompletedEvent event) {
        logger.info("檢測(cè)到大額訂單: {}, 金額: {}", event.getOrderId(), event.getAmount());
        // 大額訂單特殊處理
        notifyFinanceDepartment(event.getOrderId(), event.getAmount());
    }
    
    private void notifyFinanceDepartment(String orderId, BigDecimal amount) {
        logger.info("通知財(cái)務(wù)部門關(guān)注大額訂單: {}, 金額: {}", orderId, amount);
    }
}

3. 優(yōu)缺點(diǎn)分析

優(yōu)點(diǎn)

  • 代碼簡(jiǎn)潔,無(wú)需實(shí)現(xiàn)接口
  • 一個(gè)類可以處理多種不同類型的事件
  • 支持條件過(guò)濾,靈活性高
  • 可以使用普通POJO作為事件對(duì)象
  • 支持方法返回值作為新的事件發(fā)布(事件鏈)

缺點(diǎn)

  • 方法名不受約束,可能導(dǎo)致命名不一致
  • 無(wú)法通過(guò)類型查找實(shí)現(xiàn)特定接口的bean

4. 適用場(chǎng)景

  • 需要在單個(gè)類中處理多種事件
  • 事件邏輯簡(jiǎn)單,追求代碼簡(jiǎn)潔的場(chǎng)景
  • 需要基于條件選擇性處理事件

四、方法三:基于異步事件的處理機(jī)制

1. 基本原理

默認(rèn)情況下,Spring的事件處理是同步的,即事件發(fā)布者會(huì)等待所有監(jiān)聽(tīng)器處理完畢才會(huì)繼續(xù)執(zhí)行。對(duì)于耗時(shí)的操作,這可能導(dǎo)致性能問(wèn)題。SpringBoot提供了異步事件處理機(jī)制,使事件處理可以在獨(dú)立的線程中執(zhí)行。

異步事件處理需要兩個(gè)關(guān)鍵步驟:?jiǎn)⒂卯惒街С趾蜆?biāo)記監(jiān)聽(tīng)器為異步。

2. 實(shí)現(xiàn)步驟

2.1 啟用異步支持

在配置類上添加@EnableAsync注解:

@SpringBootApplication
@EnableAsync
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

2.2 配置異步任務(wù)執(zhí)行器(可選)

默認(rèn)情況下,Spring使用SimpleAsyncTaskExecutor執(zhí)行異步任務(wù),但在實(shí)際項(xiàng)目開發(fā)中,通常需要配置自定義的任務(wù)執(zhí)行器:

@Configuration
public class AsyncConfig implements AsyncConfigurer {
    
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(25);
        executor.setThreadNamePrefix("Event-Async-");
        executor.initialize();
        return executor;
    }
    
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new SimpleAsyncUncaughtExceptionHandler();
    }
}

2.3 創(chuàng)建異步事件監(jiān)聽(tīng)器

可以使用前兩種方法創(chuàng)建監(jiān)聽(tīng)器,只需添加@Async注解:

// 方法一:基于ApplicationListener接口的異步監(jiān)聽(tīng)器
@Component
@Async
public class AsyncEmailNotificationListener implements ApplicationListener<UserRegisteredEvent> {
    
    private static final Logger logger = LoggerFactory.getLogger(AsyncEmailNotificationListener.class);
    
    @Override
    public void onApplicationEvent(UserRegisteredEvent event) {
        logger.info("異步處理用戶注冊(cè)事件,準(zhǔn)備發(fā)送郵件,線程: {}", 
                Thread.currentThread().getName());
        
        // 模擬耗時(shí)操作
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        
        logger.info("異步郵件發(fā)送完成,用戶: {}", event.getUsername());
    }
}

// 方法二:基于@EventListener注解的異步監(jiān)聽(tīng)器
@Component
public class NotificationService {
    
    private static final Logger logger = LoggerFactory.getLogger(NotificationService.class);
    
    @EventListener
    @Async
    public void handleOrderCompletedEventAsync(OrderCompletedEvent event) {
        logger.info("異步處理訂單完成事件,準(zhǔn)備發(fā)送通知,線程: {}", 
                Thread.currentThread().getName());
        
        // 模擬耗時(shí)操作
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        
        logger.info("異步通知發(fā)送完成,訂單: {}", event.getOrderId());
    }
}

2.4 使用@TransactionalEventListener

SpringBoot還提供了特殊的事務(wù)綁定事件監(jiān)聽(tīng)器,可以控制事件處理與事務(wù)的關(guān)系:

@Component
public class OrderAuditService {
    
    private static final Logger logger = LoggerFactory.getLogger(OrderAuditService.class);
    
    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
    @Async
    public void auditOrderAfterCommit(OrderCompletedEvent event) {
        logger.info("事務(wù)提交后異步審計(jì)訂單: {}, 線程: {}", 
                event.getOrderId(), Thread.currentThread().getName());
        
        // 記錄審計(jì)日志等操作
        storeAuditRecord(event);
    }
    
    private void storeAuditRecord(OrderCompletedEvent event) {
        // 存儲(chǔ)審計(jì)記錄的邏輯
        logger.info("存儲(chǔ)訂單 {} 的審計(jì)記錄", event.getOrderId());
    }
}

@TransactionalEventListener支持四種事務(wù)階段:

  • BEFORE_COMMIT:事務(wù)提交前
  • AFTER_COMMIT:事務(wù)成功提交后(默認(rèn))
  • AFTER_ROLLBACK:事務(wù)回滾后
  • AFTER_COMPLETION:事務(wù)完成后(無(wú)論提交或回滾)

3. 優(yōu)缺點(diǎn)分析

優(yōu)點(diǎn)

  • 提高系統(tǒng)響應(yīng)速度,主線程不需等待事件處理完成
  • 適合處理耗時(shí)操作,如發(fā)送郵件、推送通知等
  • 可以與事務(wù)集成,控制事件處理時(shí)機(jī)
  • 靈活配置線程池,優(yōu)化資源使用

缺點(diǎn)

  • 增加系統(tǒng)復(fù)雜性,調(diào)試和追蹤較困難
  • 異常處理更復(fù)雜,需要特別關(guān)注
  • 資源管理需要謹(jǐn)慎,防止線程池耗盡

4. 適用場(chǎng)景

  • 事件處理包含耗時(shí)操作的場(chǎng)景
  • 系統(tǒng)對(duì)響應(yīng)時(shí)間要求高的場(chǎng)景
  • 需要與事務(wù)集成的業(yè)務(wù)操作
  • 事件處理不影響主流程的場(chǎng)景
  • 批量處理或后臺(tái)任務(wù)場(chǎng)景

五、三種事件機(jī)制的對(duì)比與選擇

特性ApplicationListener@EventListener異步事件機(jī)制
實(shí)現(xiàn)方式接口實(shí)現(xiàn)注解方法接口或注解+@Async
代碼簡(jiǎn)潔度較冗長(zhǎng)簡(jiǎn)潔取決于基礎(chǔ)機(jī)制
類型安全強(qiáng)類型依賴方法參數(shù)與基礎(chǔ)機(jī)制相同
靈活性中等
處理多事件每類型一個(gè)監(jiān)聽(tīng)器一個(gè)類多方法與基礎(chǔ)機(jī)制相同
條件過(guò)濾需編程實(shí)現(xiàn)支持SpEL表達(dá)式與基礎(chǔ)機(jī)制相同
調(diào)試難度簡(jiǎn)單簡(jiǎn)單較復(fù)雜

六、場(chǎng)景示例-用戶注冊(cè)流程

當(dāng)用戶成功注冊(cè)后,需要執(zhí)行多個(gè)后續(xù)操作,如發(fā)送歡迎郵件、初始化用戶配置、記錄審計(jì)日志等:

// 事件對(duì)象
public class UserRegistrationEvent {
    private final String username;
    private final String email;
    private final LocalDateTime registrationTime;
    
    // 構(gòu)造函數(shù)和getter省略
}

// 事件發(fā)布
@Service
public class UserServiceImpl implements UserService {
    
    private final UserRepository userRepository;
    private final ApplicationEventPublisher eventPublisher;
    
    @Autowired
    public UserServiceImpl(UserRepository userRepository, 
                           ApplicationEventPublisher eventPublisher) {
        this.userRepository = userRepository;
        this.eventPublisher = eventPublisher;
    }
    
    @Transactional
    @Override
    public User registerUser(UserRegistrationDto dto) {
        // 驗(yàn)證用戶數(shù)據(jù)
        validateUserData(dto);
        
        // 創(chuàng)建用戶
        User user = new User();
        user.setUsername(dto.getUsername());
        user.setEmail(dto.getEmail());
        user.setPassword(passwordEncoder.encode(dto.getPassword()));
        
        // 保存用戶
        User savedUser = userRepository.save(user);
        
        // 發(fā)布注冊(cè)事件
        eventPublisher.publishEvent(new UserRegistrationEvent(
                savedUser.getUsername(), 
                savedUser.getEmail(), 
                LocalDateTime.now()));
        
        return savedUser;
    }
}

// 異步郵件處理
@Component
public class EmailService {
    
    @EventListener
    @Async
    public void sendWelcomeEmail(UserRegistrationEvent event) {
        logger.info("異步發(fā)送歡迎郵件給: {}", event.getEmail());
        // 郵件發(fā)送邏輯
    }
}

// 審計(jì)日志記錄
@Component
public class AuditService {
    
    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
    public void logUserRegistration(UserRegistrationEvent event) {
        logger.info("記錄用戶注冊(cè)審計(jì)日志: {}, 時(shí)間: {}", 
                event.getUsername(), event.getRegistrationTime());
        // 審計(jì)日志記錄邏輯
    }
}

// 用戶初始化
@Component
public class UserSetupService {
    
    @EventListener
    public void setupUserDefaults(UserRegistrationEvent event) {
        logger.info("為新用戶 {} 設(shè)置默認(rèn)配置", event.getUsername());
        // 用戶配置初始化邏輯
    }
}

七、總結(jié)

在實(shí)際應(yīng)用中,可以根據(jù)具體需求選擇合適的事件處理機(jī)制,甚至混合使用不同方式。無(wú)論選擇哪種方式,遵循良好的設(shè)計(jì)原則和最佳實(shí)踐,構(gòu)建高質(zhì)量的企業(yè)應(yīng)用系統(tǒng)。

Spring事件機(jī)制可以作為輕量級(jí)的系統(tǒng)內(nèi)通信方案。通過(guò)結(jié)合消息隊(duì)列(如RabbitMQ、Kafka等),可以將本地事件擴(kuò)展到分布式環(huán)境,實(shí)現(xiàn)跨服務(wù)的事件驅(qū)動(dòng)架構(gòu)。

以上就是SpringBoot中的三種應(yīng)用事件處理機(jī)制詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot應(yīng)用事件處理機(jī)制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring的Bean注入解析結(jié)果BeanDefinition詳解

    Spring的Bean注入解析結(jié)果BeanDefinition詳解

    這篇文章主要介紹了Spring的Bean注入解析結(jié)果BeanDefinition詳解,BeanDefinition描述了一個(gè)bean實(shí)例,擁有屬性值、構(gòu)造參數(shù)值和具體實(shí)現(xiàn)的其他信息,其是一個(gè)bean的元數(shù)據(jù),xml中配置的bean元素會(huì)被解析成BeanDefinition對(duì)象,需要的朋友可以參考下
    2023-12-12
  • Mybatis如何自動(dòng)生成sql語(yǔ)句

    Mybatis如何自動(dòng)生成sql語(yǔ)句

    這篇文章主要介紹了Mybatis如何自動(dòng)生成sql語(yǔ)句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • JAVA使用POI獲取Excel的列數(shù)與行數(shù)

    JAVA使用POI獲取Excel的列數(shù)與行數(shù)

    Apache POI 是用Java編寫的免費(fèi)開源的跨平臺(tái)的 Java API,Apache POI提供API給Java程式對(duì)Microsoft Office格式檔案讀和寫的功能。 下面這篇文章給大家介紹了JAVA使用POI獲取Excel列數(shù)和行數(shù)的方法,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。
    2016-12-12
  • Springboot2.x 使用 Log4j2 異步打印日志的實(shí)現(xiàn)

    Springboot2.x 使用 Log4j2 異步打印日志的實(shí)現(xiàn)

    這篇文章主要介紹了Springboot2.x 使用 Log4j2 異步打印日志的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java?Base64編碼方法詳解及實(shí)例解析

    Java?Base64編碼方法詳解及實(shí)例解析

    Base64是一種用于將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成文本數(shù)據(jù)的編碼方式,在本文中,我們介紹了Base64.encodeBase64String方法的用途和功能,它是Java語(yǔ)言中用于Base64編碼的一個(gè)重要工具,需要的朋友可以參考下
    2023-09-09
  • JPA如何使用findBy方法自定義查詢

    JPA如何使用findBy方法自定義查詢

    這篇文章主要介紹了JPA如何使用findBy方法自定義查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java 線程生命周期與狀態(tài)轉(zhuǎn)換的核心路徑

    Java 線程生命周期與狀態(tài)轉(zhuǎn)換的核心路徑

    本文詳細(xì)講解了Java線程的6種狀態(tài),通過(guò)4個(gè)代碼案例演示了狀態(tài)轉(zhuǎn)換的核心路徑,并介紹了使用 jstack 命令分析線程狀態(tài)的實(shí)戰(zhàn)方法,理解線程的生命周期和狀態(tài)轉(zhuǎn)換,是后續(xù)學(xué)習(xí)線程同步、線程通信的基礎(chǔ),感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • java?excel轉(zhuǎn)圖片常用的幾種方法對(duì)比及建議

    java?excel轉(zhuǎn)圖片常用的幾種方法對(duì)比及建議

    在Java開發(fā)中,借助報(bào)表插件能夠輕松實(shí)現(xiàn)將工作表、任意指定區(qū)域以及各種形狀類型轉(zhuǎn)換為圖片,這篇文章主要介紹了java?excel轉(zhuǎn)圖片常用的幾種方法對(duì)比及建議,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-09-09
  • 在SpringBoot中靈活使用異步事件的操作步驟

    在SpringBoot中靈活使用異步事件的操作步驟

    SpringBoot中的異步事件機(jī)制通過(guò)事件源和事件監(jiān)聽(tīng)器的解耦,實(shí)現(xiàn)了松耦合的組件間通信,事件源發(fā)布事件,監(jiān)聽(tīng)器異步處理事件,本文介紹在SpringBoot中靈活使用異步事件的操作,感興趣的朋友一起看看吧
    2025-03-03
  • JAVA 中的大數(shù)字操作類詳解

    JAVA 中的大數(shù)字操作類詳解

    Java的BigInteger類用于處理超出int和long范圍的大整數(shù),而BigDecimal類則用于高精度的浮點(diǎn)數(shù)運(yùn)算,這兩個(gè)類都是Number的子類,提供了一系列方法執(zhí)行加減乘除等運(yùn)算,BigInteger不支持表示小數(shù),只能表示整數(shù),BigDecimal可以控制小數(shù)位數(shù)和舍入方式,感興趣的朋友一起看看吧
    2024-10-10

最新評(píng)論

大悟县| 泸溪县| 贵溪市| 陇川县| 共和县| 文成县| 海口市| 易门县| 台东市| 丰原市| 会泽县| 吴川市| 磐安县| 确山县| 当涂县| 浑源县| 延寿县| 托克逊县| 大城县| 凌海市| 综艺| 万盛区| 金阳县| 辽宁省| 拜城县| 连城县| 安溪县| 贡觉县| 肥西县| 花莲市| 密山市| 外汇| 衡阳市| 大足县| 论坛| 山东省| 绥芬河市| 蓬莱市| 衡东县| 南雄市| 乐至县|