亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java 代碼實(shí)例解析設(shè)計模式之監(jiān)聽者模式

 更新時間:2021年10月26日 14:15:12   作者:一月三千五  
所謂監(jiān)聽者模式,我理解的是構(gòu)建一個容器存放所有被監(jiān)聽的線程或?qū)ο螅O(jiān)聽每個線程或?qū)ο蟀l(fā)生的變化,若某個線程或?qū)ο笥|發(fā)指定規(guī)則,那么則對所有被監(jiān)聽的線程或?qū)ο蟾鶕?jù)業(yè)務(wù)需要做處理

代碼展示

Main:測試類

ObServer:每個被監(jiān)聽的對象實(shí)現(xiàn)該接口,重寫該方法,完成自己的業(yè)務(wù)

public interface ObServer {
 
    /**
     * 當(dāng)某一個被監(jiān)控的對象發(fā)生變化時
     * 所有實(shí)現(xiàn)該方法處理方法
     */
    void exceptionHandler();
 
}

Subject:監(jiān)聽者容器

public interface Subject {
 
 
    /**
     * 添加被觀察對象
     */
    void add(ObServer obServer);
 
    /**
     * 通知所有被觀察者完成自己的 exceptionHandler 方法
     */
    void notifyAllSubject();
 
}

SubjectHandler:監(jiān)聽者容器的實(shí)現(xiàn)類

public class SubjectHandler implements Subject {
 
    /**
     * 存放被監(jiān)聽對象
     */
    private static final List<ObServer> SUBJECTS = Collections.synchronizedList(new LinkedList<>());
 
    @Override
    public void add(ObServer subject) {
        SUBJECTS.add(subject);
    }
 
    @Override
    public void notifyAllSubject() {
        SUBJECTS.forEach(ObServer::exceptionHandler);
    }
}

Thread1、Thread2 測試對象

模擬兩個線程對數(shù)據(jù)庫操作,若Threa1執(zhí)行時出異常了,那么終止所有線程并對其回滾。

Threa1:

public class Thread1 implements ObServer, Runnable {
 
    @SneakyThrows
    @Override
    public void run() {
        System.out.println("thread1 run");
        Thread.sleep(1000);
        System.out.println("t1 end");
    }
 
    @SneakyThrows
    @Override
    public void exceptionHandler() {
        System.out.println("thread1 rollback.....");
    }
}

Thread2:

public class Thread2 implements ObServer, Runnable {
 
    private static Thread CURRENT_THREAD;
 
    private static volatile boolean FLAG = false;
 
    @SneakyThrows
    @Override
    public void run() {
        CURRENT_THREAD = Thread.currentThread();
        System.out.println("thread2 running");
        int count = 0;
        while (!FLAG) {
            System.out.println(count);
            count++;
        }
        System.out.println("thread2 end");
    }
 
 
    @SneakyThrows
    @Override
    public void exceptionHandler() {
        FLAG = true;
        CURRENT_THREAD.interrupt();
        System.out.println("thread2 rollback.....");
    }
}

測試Demo

public static void main(String[] args) throws InterruptedException {
 
        // 創(chuàng)建監(jiān)聽容器
        Subject subject = new SubjectHandler();
        Thread1 thread1 = new Thread1();
        Thread2 thread2 = new Thread2();
        subject.add(thread1);
        subject.add(thread2);
        
        CompletableFuture.supplyAsync(() -> {
            new Thread(thread1).start();
            try {
                Thread.sleep(10);
                int a = 1 / 0; // 模擬線程1報錯
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return true;
        }).exceptionally((error) -> {
            subject.notifyAllSubject();
            return false;
        });
 
        CompletableFuture.supplyAsync(() -> {
            new Thread(thread2).start();
            return true;
        }).exceptionally((error) -> {
            subject.notifyAllSubject();
            return false;
        });
 
        // main thread await
        Thread.sleep(60 * 1000);
    }

測試結(jié)果

在 java.util 包下提供了Observable(監(jiān)聽容器)和 Observer接口(被監(jiān)聽者),用法跟我們完全一致,只需實(shí)現(xiàn)Observer的update方法,把每個Observer子類添加到監(jiān)聽容器中。

注意:在調(diào)用監(jiān)聽容器的通知所有servers時首先調(diào)用一下其setChanged方法

將changed變?yōu)閠rue(默認(rèn)flase)

到此這篇關(guān)于Java 代碼實(shí)例解析設(shè)計模式之監(jiān)聽者模式的文章就介紹到這了,更多相關(guān)Java 設(shè)計模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳細(xì)總結(jié)Java基礎(chǔ)類和包裝類

    詳細(xì)總結(jié)Java基礎(chǔ)類和包裝類

    近幾天一直在復(fù)習(xí)Java基礎(chǔ)知識,今天就帶大家總結(jié)一下Java基礎(chǔ)類和包裝類,下文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)Java基礎(chǔ)的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • SpringMVC攔截器詳解

    SpringMVC攔截器詳解

    本篇文章主要介紹了SpringMVC攔截器配置及使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-07-07
  • java組件commons-fileupload實(shí)現(xiàn)文件上傳、下載、在線打開

    java組件commons-fileupload實(shí)現(xiàn)文件上傳、下載、在線打開

    這篇文章主要介紹了java組件commons-fileupload實(shí)現(xiàn)文件上傳、下載、在線打開,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • SpringBoot指標(biāo)監(jiān)控的實(shí)現(xiàn)

    SpringBoot指標(biāo)監(jiān)控的實(shí)現(xiàn)

    本文主要介紹了SpringBoot指標(biāo)監(jiān)控的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • SpringBoot Feign使用教程超全面講解

    SpringBoot Feign使用教程超全面講解

    現(xiàn)在的微服務(wù)項(xiàng)目不少都使用的是springboot+Feign構(gòu)建的項(xiàng)目,微服務(wù)之間的調(diào)用都離不開feign來進(jìn)行遠(yuǎn)程調(diào)用,這篇文章主要介紹了SpringBoot Feign使用教程,需要的朋友可以參考下
    2022-11-11
  • 深入理解Java中的volatile關(guān)鍵字(總結(jié)篇)

    深入理解Java中的volatile關(guān)鍵字(總結(jié)篇)

    volatile這個關(guān)鍵字,不僅僅在Java語言中有,在很多語言中都有的,而且其用法和語義也都是不盡相同的。這篇文章主要介紹了Java中的volatile關(guān)鍵字,需要的朋友可以參考下
    2018-10-10
  • 帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之高級排序

    帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之高級排序

    這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之高級排序,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 將對象轉(zhuǎn)化為字符串的java實(shí)例

    將對象轉(zhuǎn)化為字符串的java實(shí)例

    這篇文章主要介紹了將對象轉(zhuǎn)化為字符串的java實(shí)例,有需要的朋友可以參考一下
    2013-12-12
  • 如何將java或javaweb項(xiàng)目打包為jar包或war包

    如何將java或javaweb項(xiàng)目打包為jar包或war包

    本文主要介紹了如何將java或javaweb項(xiàng)目打包為jar包或war包,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Java中的ArrayList、LinkedList、HashSet等容器詳解

    Java中的ArrayList、LinkedList、HashSet等容器詳解

    這篇文章主要介紹了Java中的ArrayList、LinkedList、HashSet等容器詳解,集合表示一組對象,稱為其元素,有些集合允許重復(fù)元素,而另一些則不允許,有些是有序的,有些是無序的,需要的朋友可以參考下
    2023-08-08

最新評論