Java怎么实现监听者模式
导读:本文共1897.5字符,通常情况下阅读需要6分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 代码展示Main:测试类ObServer:每个被监听的对象实现该接口,重写该方法,完成自己的业务publicinterfaceObServer{/***当某一个被监控的对象发生变化时*所有实现该方法处理方法*/voidexceptionHandler();}Subject:监听者容器publicinterfaceSubject{/***添加... ...
音频解说
目录
(为您整理了一些要点),点击可以直达。代码展示
Main:测试类
ObServer:每个被监听的对象实现该接口,重写该方法,完成自己的业务
publicinterfaceObServer{/***当某一个被监控的对象发生变化时*所有实现该方法处理方法*/voidexceptionHandler();}
Subject:监听者容器
publicinterfaceSubject{/***添加被观察对象*/voidadd(ObServerobServer);/***通知所有被观察者完成自己的exceptionHandler方法*/voidnotifyAllSubject();}
SubjectHandler:监听者容器的实现类
publicclassSubjectHandlerimplementsSubject{/***存放被监听对象*/privatestaticfinalList<ObServer>SUBJECTS=Collections.synchronizedList(newLinkedList<>());@Overridepublicvoidadd(ObServersubject){SUBJECTS.add(subject);}@OverridepublicvoidnotifyAllSubject(){SUBJECTS.forEach(ObServer::exceptionHandler);}}
Thread1、Thread2 测试对象
模拟两个线程对数据库操作,若Threa1执行时出异常了,那么终止所有线程并对其回滚。
Threa1:
publicclassThread1implementsObServer,Runnable{@SneakyThrows@Overridepublicvoidrun(){System.out.println("thread1run");Thread.sleep(1000);System.out.println("t1end");}@SneakyThrows@OverridepublicvoidexceptionHandler(){System.out.println("thread1rollback.....");}}
Thread2:
publicclassThread2implementsObServer,Runnable{privatestaticThreadCURRENT_THREAD;privatestaticvolatilebooleanFLAG=false;@SneakyThrows@Overridepublicvoidrun(){CURRENT_THREAD=Thread.currentThread();System.out.println("thread2running");intcount=0;while(!FLAG){System.out.println(count);count++;}System.out.println("thread2end");}@SneakyThrows@OverridepublicvoidexceptionHandler(){FLAG=true;CURRENT_THREAD.interrupt();System.out.println("thread2rollback.....");}}
测试Demo
publicstaticvoidmain(String[]args)throwsInterruptedException{//创建监听容器Subjectsubject=newSubjectHandler();Thread1thread1=newThread1();Thread2thread2=newThread2();subject.add(thread1);subject.add(thread2);CompletableFuture.supplyAsync(()->{newThread(thread1).start();try{Thread.sleep(10);inta=1/0;//模拟线程1报错}catch(InterruptedExceptione){e.printStackTrace();}returntrue;}).exceptionally((error)->{subject.notifyAllSubject();returnfalse;});CompletableFuture.supplyAsync(()->{newThread(thread2).start();returntrue;}).exceptionally((error)->{subject.notifyAllSubject();returnfalse;});//mainthreadawaitThread.sleep(60*1000);}
测试结果
在 java.util 包下提供了Observable(监听容器)和 Observer接口(被监听者),用法跟我们完全一致,只需实现Observer的update方法,把每个Observer子类添加到监听容器中。
注意:在调用监听容器的通知所有servers时首先调用一下其setChanged方法
将changed变为true(默认flase)
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:
Java怎么实现监听者模式的详细内容,希望对您有所帮助,信息来源于网络。