您好,登錄后才能下訂單哦!
這篇文章主要介紹了Java怎么實(shí)現(xiàn)監(jiān)聽者模式,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
代碼展示
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報(bào)錯 } 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)
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Java怎么實(shí)現(xiàn)監(jiān)聽者模式”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。