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

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

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

代碼展示

Main:測(cè)試類

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

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

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

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

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

public class SubjectHandler implements Subject {
 
    /**
     * 存放被監(jiān)聽對(duì)象
     */
    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 測(cè)試對(duì)象

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

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.....");
    }
}

測(cè)試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報(bào)錯(cuò)
            } 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);
    }

測(cè)試結(jié)果

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

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

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

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

相關(guān)文章

  • 詳解Java的Hibernate框架中的List映射表與Bag映射

    詳解Java的Hibernate框架中的List映射表與Bag映射

    這篇文章主要介紹了Java的Hibernate框架中的List映射表與Bag映射,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • java Swing實(shí)現(xiàn)選項(xiàng)卡功能(JTabbedPane)實(shí)例代碼

    java Swing實(shí)現(xiàn)選項(xiàng)卡功能(JTabbedPane)實(shí)例代碼

    這篇文章主要介紹了java Swing實(shí)現(xiàn)選項(xiàng)卡功能(JTabbedPane)實(shí)例代碼的相關(guān)資料,學(xué)習(xí)java 基礎(chǔ)的朋友可以參考下這個(gè)簡(jiǎn)單示例,需要的朋友可以參考下
    2016-11-11
  • Spring Data分頁(yè)與排序的實(shí)現(xiàn)方法

    Spring Data分頁(yè)與排序的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于Spring Data分頁(yè)與排序的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • SpringBoot結(jié)合ProGuard實(shí)現(xiàn)代碼混淆(最新版)

    SpringBoot結(jié)合ProGuard實(shí)現(xiàn)代碼混淆(最新版)

    這篇文章主要介紹了SpringBoot結(jié)合ProGuard實(shí)現(xiàn)代碼混淆(最新版),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Spring中緩存注解@Cache的使用詳解

    Spring中緩存注解@Cache的使用詳解

    這篇文章主要介紹了Spring中緩存注解@Cache的使用詳解,使用注解對(duì)數(shù)據(jù)進(jìn)行緩存功能的框架,只需要簡(jiǎn)單地加一個(gè)注解,就能實(shí)現(xiàn)緩存功能,大大簡(jiǎn)化我們?cè)跇I(yè)務(wù)中操作緩存的代碼,需要的朋友可以參考下
    2023-07-07
  • java表單提交中文亂碼的解決方法

    java表單提交中文亂碼的解決方法

    這篇文章主要介紹了java表單提交中文亂碼的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • RocketMQ重試機(jī)制及消息冪代碼實(shí)例解析

    RocketMQ重試機(jī)制及消息冪代碼實(shí)例解析

    這篇文章主要介紹了RocketMQ重試機(jī)制及消息冪代碼實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 在java中 利用匿名內(nèi)部類進(jìn)行較簡(jiǎn)潔的雙括弧初始化的方法

    在java中 利用匿名內(nèi)部類進(jìn)行較簡(jiǎn)潔的雙括弧初始化的方法

    本篇文章小編將為大家介紹,關(guān)于在java中 利用匿名內(nèi)部類進(jìn)行較簡(jiǎn)潔的雙括弧初始化的方法,有需要的朋友可以參考一下
    2013-04-04
  • Spring中11個(gè)最常用的擴(kuò)展點(diǎn)總結(jié),你知道幾個(gè)

    Spring中11個(gè)最常用的擴(kuò)展點(diǎn)總結(jié),你知道幾個(gè)

    我們知道IOC(控制反轉(zhuǎn))和AOP(面向切面編程)是spring的基石,除此之外spring的擴(kuò)展能力非常強(qiáng),下面這篇文章主要給大家介紹了關(guān)于Spring中11個(gè)最常用的擴(kuò)展點(diǎn)的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • 如何通過(guò)JVM角度談?wù)凧ava的clone操作

    如何通過(guò)JVM角度談?wù)凧ava的clone操作

    java中僅有的創(chuàng)建對(duì)象的兩種方式:①.使用new操作符創(chuàng)建對(duì)象;②.使用clone方法復(fù)制對(duì)象。下面這篇文章主要通過(guò)JVM角度給大家詳細(xì)談?wù)凧ava的clone操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-06-06

最新評(píng)論

沾化县| 凉山| 平潭县| 铜山县| 平遥县| 东平县| 延吉市| 皋兰县| 花垣县| 策勒县| 五河县| 防城港市| 黄陵县| 县级市| 偏关县| 博爱县| 纳雍县| 腾冲县| 吴旗县| 徐汇区| 平阳县| 无极县| 伊通| 沽源县| 和田市| 赣州市| 霍林郭勒市| 琼海市| 介休市| 涟源市| 霍州市| 胶南市| 缙云县| 光泽县| 平凉市| 武胜县| 奉新县| 七台河市| 岢岚县| 彭水| 莆田市|