精华内容
下载资源
问答
  • 实现了事件监听者接口中一些或全部方法的类就是事件监听者。 (个人理解:) 将需要监听的对象封装在自定义的事件状态对象类(EventObject)中,这个类必须继承java.util.EventObject。事件状态对象作为单参传递给应响...

    java中的事件机制的参与者有3种角色:

    1.event object:事件状态对象,用于listener的相应的方法之中作为参数,一般存在与listerner的方法之中

    2.event source:具体的事件源,比如说,你点击一个button,那么button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener。

    3.event listener:对每个明确的事件的发生,都相应地定义一个明确的Java方法。这些方法都集中定义在事件监听者(EventListener)接口中,这个接口要继承 java.util.EventListener。 实现了事件监听者接口中一些或全部方法的类就是事件监听者。

    (个人理解:)

    将需要监听的对象封装在自定义的事件状态对象类(EventObject)中,这个类必须继承java.util.EventObject。事件状态对象作为单参传递给应响应该事件的自定义监听器方法中。该自定义监听器需实现自定义监听接口,实现此接口中以事件状态对象为参数的方法。发出某种特定事件的事件源:必须在类中实例化自定义的监听器对象,当监听到event object时,调用相应方法进行处理。

    先看看jdk提供的event包:

    public interface EventListener:所有事件侦听器接口必须扩展的标记接口。

    public class EventObject extends Object implements Serializable

    所有事件状态对象都将从其派生的根类。 所有 Event 在构造时都引用了对象 "source",在逻辑上认为该对象是最初发生有关 Event 的对象。

    举例:

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    1 //自定义的事件状态对象类

    2 class MyEvent extends EventObject

    3 {

    4 private Object obj;

    5 //此监听对象可以是自定义对象

    6 private String sName;

    7 public MyEvent(Object source,String sName)

    8 {

    9 super(source);

    10 this.obj=source;

    11 this.sName=sName; }

    12 public Object getObj()

    13 {

    14 return obj;

    15 }

    16 public String getsName()

    17 {

    18 return sName;

    19 }

    20 }

    21 //定义自定义监听器接口,继承EventListener

    22 interface MyEventListener extends EventListener

    23 {

    24 void handleEvent (MyEvent me);

    25 }

    26 //定义事件源

    27 class MyEventSource

    28 {

    29 private Vector list=new Vector();

    30 private String sName = "";

    31 public MyEventSource()

    32 {

    33 super();

    34 }

    35 public void addMyEventListener(MyEventListener me)

    36 {

    37 list.add(me);

    38 }

    39 public void deleteMyEventListener(MyEventListener me)

    40 {

    41 list.remove(me);

    42 }

    43 public void notifyMyEvent(MyEvent me)

    44 {

    45 Iterator it=list.iterator();

    46 while(it.hasNext())

    47 {

    48 //在类中实例化自定义的监听器对象,并调用监听器方法

    49 ((MyEventListener) it.next()).handleEvent(me);

    50 }

    51 }

    52 public void setName(String str)

    53 { boolean bool = false;

    54 if (str == null && sName != null)

    55 bool = true;

    56 else if (str != null && sName == null)

    57 bool = true;

    58 else if (!sName.equals(str))

    59 bool = true;

    60 this.sName = str;

    61 // 如果改变则执行事件

    62 if (bool)

    63 notifyMyEvent(new MyEvent(this, sName));

    64 }

    65 public String getsName()

    66 { return sName; }

    67 }

    68 //自定义监听器,继承自定义监听接口

    69 class Mylistener implements MyEventListener

    70 {

    71 public Map map =null;

    72 public int i=0;

    73

    74 public Mylistener(Map map)

    75 {

    76 this.map = map;

    77 MyEventSource mes = new MyEventSource();

    78 mes.addMyEventListener(this);

    79 mes.setName("niu");

    80 }

    81

    82 //实现接口中的方法

    83 public void handleEvent(MyEvent me)

    84 {

    85 System.out.println("me.getSource() "+me.getSource());

    86 System.out.println("me.getsName() "+me.getsName());

    87 //此处可以将写,将监听到的对象存入map中

    88 map.put(++i, me.getsName());

    89 }

    90 }

    91 //主函数

    92 public class test2

    93 {

    94 public static void main(String args[])

    95 {

    96 Map map = new HashMap();

    97 Mylistener mylistener = new Mylistener(map);

    98 }

    99 }

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    实际运用可能是:

    事件源是一个一直接收的线程,线程中一直监听需要监听的对象

    在主函数中执行两个线程

    1.事件源的接收线程

    2.一个计时器,每隔一段时间先试一下监听到的对象个数

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    TimerTask task = new TimerTask() {

    @Override

    public void run() {

    System.out.println("size:"+DPMap.size());

    }

    };

    Calendar calendar = Calendar.getInstance();

    Date firstTime = calendar.getTime();

    Timer timer = new Timer();

    timer.schedule(task, firstTime, 20*1000);

    展开全文
  • 现在做了个局域网内的程序,一台电脑对应若干台安卓手机。手机给电脑发送的字节当然都能正常响应,因为程序是我做的。...怎么解决,有什么思路?尤其是以后如果把电脑端程序做成非局域网的,做成服务器。
  • 可以利用redis的事务加上watch监听方法,具体代码如下!1 package com.github.distribute.lock.redis;23 import java.util.list;4 import java.util.set;5 import java.util.concurrent.executorservice;6 import java...

    可以利用redis的事务加上watch监听方法,具体代码如下!

    1 package com.github.distribute.lock.redis;

    2

    3 import java.util.list;

    4 import java.util.set;

    5 import java.util.concurrent.executorservice;

    6 import java.util.concurrent.executors;

    7

    8 import redis.clients.jedis.jedis;

    9 import redis.clients.jedis.transaction;

    10

    11 /**

    12 * redis乐观锁实例

    13 * @author linbingwen

    14 *

    15 */

    16 public class optimisticlocktest {

    17

    18 public static void main(string[] args) throws interruptedexception {

    19 long startime=system.currenttimemillis();

    20

    21 initprduct();

    22 initclient();

    23 printresult();

    24

    25 long endtime=system.currenttimemillis();

    26 long time=endtime-startime;

    27 system.out.println("程序运行时间: "+time+"ms");

    28

    29 }

    30

    31 /**

    32 * 输出结果

    33 */

    34 public static void printresult() {

    35 jedis jedis = redisutil.getinstance().getjedis();

    36 set set = jedis.smembers("clientlist");

    37

    38 int i = 1;

    39 for (string value : set) {

    40 system.out.println("第" + i++ + "个抢到商品,"+value + " ");

    41 }

    42

    43 redisutil.returnresource(jedis);

    44 }

    45

    46 /*

    47 * 初始化顾客开始抢商品

    48 */

    49 public static void initclient() {

    50 executorservice cachedthreadpool = executors.newcachedthreadpool();

    51 int clientnum = 10000;// 模拟客户数目

    52 for (int i = 0; i < clientnum; i++) {

    53 cachedthreadpool.execute(new clientthread(i));

    54 }

    55 cachedthreadpool.shutdown();

    56

    57 while(true){

    58 if(cachedthreadpool.isterminated()){

    59 system.out.println("所有的线程都结束了!");

    60 break;

    61 }

    62 try {

    63 thread.sleep(1000);

    64 } catch (interruptedexception e) {

    65 e.printstacktrace();

    66 }

    67 }

    68 }

    69

    70 /**

    71 * 初始化商品个数

    72 */

    73 public static void initprduct() {

    74 int prdnum = 100;// 商品个数

    75 string key = "prdnum_100001";

    76 string clientlist = "clientlist";// 抢购到商品的顾客列表

    77 jedis jedis = redisutil.getinstance().getjedis();

    78

    79 if (jedis.exists(key)) {

    80 jedis.del(key);

    81 }

    82

    83 if (jedis.exists(clientlist)) {

    84 jedis.del(clientlist);

    85 }

    86

    87 jedis.set(key, string.valueof(prdnum));// 初始化

    88 redisutil.returnresource(jedis);

    89 }

    90

    91 }

    92

    93 /**

    94 * 顾客线程

    95 *

    96 * @author linbingwen

    97 *

    98 */

    99 class clientthread implements runnable {

    100 jedis jedis = null;

    101 string key = "prdnum_10001";// 商品主键

    102 string clientlist = "clientlist"; 抢购到商品的顾客列表主键

    103 string clientname;

    104

    105 public clientthread(int num) {

    106 clientname = "编号=" + num;

    107 }

    108

    109 public void run() {

    110 try {

    111 thread.sleep((int)(math.random()*5000));// 随机睡眠一下

    112 } catch (interruptedexception e1) {

    113 }

    114 while (true) {

    115 system.out.println("顾客:" + clientname + "开始抢商品");

    116 jedis = redisutil.getinstance().getjedis();

    117 try {

    118 jedis.watch(key);

    119 int prdnum = integer.parseint(jedis.get(key));// 当前商品个数

    120 if (prdnum > 0) {

    121 transaction transaction = jedis.multi();

    122 transaction.set(key, string.valueof(prdnum - 1));

    123 list result = transaction.exec();

    124 if (result == null || result.isempty()) {

    125 system.out.println("悲剧了,顾客:" + clientname + "没有抢到商品");// 可能是watch-key被外部修改,或者是数据操作被驳回

    126 } else {

    127 jedis.sadd(clientlist, clientname);// 抢到商品记录一下

    128 system.out.println("好高兴,顾客:" + clientname + "抢到商品");

    129 break;

    130 }

    131 } else {

    132 system.out.println("悲剧了,库存为0,顾客:" + clientname + "没有抢到商品");

    133 break;

    134 }

    135 } catch (exception e) {

    136 e.printstacktrace();

    137 } finally {

    138 jedis.unwatch();

    139 redisutil.returnresource(jedis);

    140 }

    141

    142 }

    143 }

    144

    145 }

    如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

    展开全文
  • 这篇文章我们从消息有序、防止重复消费的角度介绍下kafka的消费流程。任何的消息队列都存在一个消费者的角色,kafka也是如此,但是相比较单独消费者而言,kafka提出了一个消费组的概念。 Consumer Group(消费者组):...

      上一篇文章讲解了kafka如果生产不丢失数据。这篇文章我们从消息有序、防止重复消费的角度介绍下kafka的消费流程。

       任何的消息队列都存在一个消费者的角色,kafka也是如此,但是相比较单独消费者而言,kafka提出了一个消费组的概念。

       Consumer Group(消费者组):官网的定义就是消费者使用一个消费者组名来标记自己,topic的每条消息都只会发送到每个订阅它的消费者组的一个消费者实例上。

      那我们对消费者组就可以理解为:多个消费者组成一个消费者组,消费者组订阅的topic只会发送到一个消费者实例上,而一个topic可以发送到多个消费者组。   d2f6dedd8e1ce21c334765b638813140.png

      看到这,您肯定会有一个疑问,既然存在单独的消费者,为什么还要设计一个消费者组呢?消费者组能做什么用呢?

      官方给出的解释是这样的:消费者组是一个高伸缩性、高容错性的consumer机制,组内的多个实例读取Kafka消息,当存在某个consumer"挂"了,消费者组会将挂掉的consumer负责的分区转给其他消费者,组内还可以正常的运行。

      我们先来解释下消费组的内部运行:重平衡(rebalance)

       什么情况下会发送重平衡呢?

       消费者组内的消费者发送新增、删除的时候会发生重平衡。消费者组内订阅的topic发送变化的时候也会发生重平衡。消费者组内的topic的分区数发生变化的时候也会发生重平衡。

        为什么这些情况下会发生重平衡呢?

        先来了解下消费者组的分区策略:range策略和roundrobin策略以及新增加的StickyAssignor策略。

    9dd7686d5a53fcbda9fafb101a80ffef.png

       Range策略:kafka消费者组内默认的分区策略。针对于每个topic而言,先按照字母顺序进行排序,然后分区数量除消费者数量。如果除不尽,则前面的消费者多消费一个分区。

       例如:3个消费者线程A、B、C。假设一个topic存在10个分区。

       线程A消费的分区数是:0,1,2,3

       线程B消费的分区数是:4,5,6

       线程C消费的分区数是:7,8,9

       roundrobin策略:针对于全部的topic的分区统计后按照字典序排序,然后平均分配给消费者。

    了解到了分区策略可以看到,不管是topic的变化还是consumer的变化以及分区数量的变化都会导致消费者组内重新进行分区。

      消费者组内的重平衡过程是怎么运行的呢

     了解重平衡运行之前,我们先介绍一个名词:coordinate,中文名叫:组协调器。组协调器的作用是存储组的相关Mete数据。怎么确定consumer group的coordinator是那个broker呢?consumer group 会提交offset给对应的分区,该分区所在的broker就是coordinator。

    9b90cde045de63b673cde0e05c36c3ab.png

    消费者组协调器和消费者组内的每个消费者都相互建立心跳监测。重平衡的请求类型:

    JoinGroup:consumer请求加入组。

    SyncGroup:group leader 把分配方案同步更新到组内的所有成员。

    heartbeat:consumer定期向coordinator汇报心跳证明自己存活。

    5cb2f10c04d010b8c48f8c68702c0d1a.png

    consumer group的分配方案是在consumer端执行的。所以consumer成员把自身的订阅的情况汇报给协调器,协调器会把信息汇总发给leader的consumer,由leader分配每个consumer消费信息,然后返回协调器,由协调器通知所有的consumer。

    组内的offset提交是如何执行的?

    先来了解下kafka 消费者的offset都是怎么提交的。kafka自身维护了一个_consumer_offsets来存储每个topic消费的位移。

    consumer消费端的位移提交可以是手动提交或者自动提交。当然自动提交需要容忍一定的消息丢失,而手动提交需要容忍消息的重复消费。为什么这么讲呢?自动提交的时候假如你消费失败,下次消费的时候重新拉下来的数据会是下一条,而不会是当前消费失败的数据。手动提交的时候,假如业务逻辑执行时间太长,规定时间内没有提交offset,下一次触发consumer拉数据,还会从上一次提交的offset起点拉取,所以拉取下来是相同的数据。

    手动提交可以是同步也可以是异步,consumer.commitSync()同步提交  consumer.commitAsync(callback)异步提交。当然实际开发应用中,应该是同步+异步相结合的提交方式最为稳妥。

    消费者组存在一个监听器。监听器主要是一个接口回调类ConsummerRebalanceListener。接口中存在两个方法:onPartitionsRevoker (下一轮重平衡前调用前,通常用于提交当前topic的位移)。onPartitionsAssigned(下一轮重平衡后调用)

    be6dc8d100472c5dd59de71875ff2b37.png

    consumer是怎么拉取数据的?

    dee6d82e1d3629aa538cfd5324ef150a.png

    调用consumer.poll()方法拉取对应topic中的数据,poll方法的入参是时间。

    很多时候能够poll到的数据分两种情况:1、topic中未消费的数据足够多 2、等待的时间超过了设定的超时时间。

    解释下情况1:通常指定消费者的时候会设置一个参数:max.poll.records该参数控制单次调用poll的时候返回的最大条数。当topic中未消费的数据达不到指定条数的时候,不设置超时时间就poll不到数据。

    退出消费者程序的方式:

       退出循环需要通过另一个线程调用consumer.wakeup()方法,调用consumer.wakeup()可以退出poll(),并抛出WakeupException异常 ,我们不需要处理 WakeupException,因为它只是用于跳出循环的一种方式,consumer.wakeup()是消费者唯一一个可以从其他线程里安全调用的方法   如果循环运行在主线程里,可以在 ShutdownHook里调用该方法。

    有关多线程消费的问题:

       1、多work线程+一个主线程   KafkaConsumer是非线程安全的,多线程需要处理好线程同步。主线程KafkaConsumer从topic上面poll下来的多条数据,可以采用线程池的方式去处理。但是这种方式无法保证有序性。

     2 、多个主线程。设置多个分区,一个分区一个KafkaConsumer线程。

    cc6e3a00298a37b735ed61097f103cac.png

    我是凯腾凯,互联网浪潮下一枚苟且偷生的程序员

    展开全文
  • 1. 有一款真心话大冒险游戏,敢聊,为了保护个人隐私,对方发过来的照片,需要长按才能观看,松手图片消失,这样就可以防止用户进行保存。 2.但是我如果在按着的期间对屏幕进行截屏,那么图片岂不是保存了,然而...

    1. 有一款真心话大冒险游戏,敢聊,为了保护个人隐私,对方发过来的照片,需要长按才能观看,松手图片消失,这样就可以防止用户进行保存。

    2.但是我如果在按着的期间对屏幕进行截屏,那么图片岂不是保存了,然而对方是可以看到的,提示图片被截屏

    3. 那么对方是怎么知道的呢?   软件监听截屏事件? 安卓中没有监听截屏事件的接口,那么我们可以监听媒体库的变化。具体的是,当我们手指长按图片,开启监听事件,如果媒体库发生变化,我们就认为你对图片进行了截屏,然后发送给服务器,服务器再把这个事件传递给对方。

    展开全文
  • 据说 为了防止恶意软件 谷歌封了非系统级应用监听开机广播的权限,网上很多说将app安装到system/app目录下,但是手机必须提供root权限,且怎么能要求所有用户都将应用安装到系统目录下。现在我想做消息的轮询,...
  • 最近研究如何在车机上支持微信语音播报接收的信息,以前项目用过AccessibilityService辅助服务去监听第三方应用的信息,因此考虑...微信是怎么做到防止辅助服务去监听的? 带着上面问题,反编译了微信源码,结果是一
  • 注意事项:1、layui 中提交按钮是基于“监听”机制实现的。2、form.on() 的调用需置于 layui.use 的回调函数中。3、末尾的 'return false' 不可或缺,以确保不会触发页面刷新。注意必须是 'return false',而不能...
  • 实现异地与同地登录判断 要将先登录的用户强制下线。不免用到session。 单点登录的最大难题:已经登录且重复登录的用户的session怎么web全局操作它 ...2.建立一个登录人员监听,} 怎么建立全局呢,还记得js...
  • -- 防止内存泄漏的监听器 --> org.springframework.web.util.IntrospectorCleanupListener <!-- 配置Springmvc核心控制器 --> <servlet-name>springmvc <servlet-class>org.springframework.web....
  • JavaScript 防抖与节流

    2019-11-22 15:48:03
    DOM 事件中有很多高频操作,比如 onscroll 滚动监听,input 输入值监听,获取屏幕尺寸 resize 等。在实际应用场景中还有防止按钮多次点击。那么怎么减少高频事件的执行和阻止按钮多次点击昵?最好的方案就是防抖与...
  • 加密是将数据资料加密,使得非法用户即使取得加密过的资料,也无法获取正确的资料内容,所以数据加密可以保护数据,防止监听攻击。其重点在于数据的安全性。 身份认证是用来判断某个身份的真实性,确认身份后,系统...
  • DHCP-snooping的原理、配置、案例

    万次阅读 2018-01-26 17:15:55
    DHCP-snooping还有一个非常重要的作用就是建立一张DHCP监听绑定表,既然DHCP-snooping这么重要,那么让我们来看看他是怎么样配置的! 案例需求 1.PC可以从指定DHCP Server获取到IP地址; 2.防止其他...
  • 如何按照中心线对齐null和undefine的区别安全机制对于安全机制中,过滤标签问题,比如一个“ 《”符号,经过转码后,如何过滤掉转码后的“ 《” 跨域防抖节流js事件流 h5怎么防止手动缩放 怎么解决点击后300ms的延迟...
  • Think4Android(二)之Button

    千次阅读 2016-07-12 23:03:41
    预览一下:  Android中的按钮是继承之TextView的,今天想了一会儿怎么对按钮进行一些点击上的优化或者说是定制吧。原理是自定义一个抽象的‘监听器’实现我们的OnClickListener然后在... --1.Button怎么样做到防止
  • 1.对网站信息传输以https方式加密,防止信息被监听、截取和篡改; 2.验证网站身份,防止钓鱼网站,同事提高企业形象,增加用户安全感; 3.利于提高在百度谷歌等搜索中的排名权重和收录优势; 但是SSL证书错误怎么...
  • js中实现防抖与节流

    2020-09-09 01:01:02
    防抖是防止一些监听函数触发得过于频繁而给服务器造成压力,例如搜索框在用户停止键入后达到2秒才触发一次补全请求。 节流是停止一段时间后才允许再次被执行。例如获取验证码按钮设置相隔30秒才能按一次。
  • 1、面试题 —— 如何防止一个URL对应的图片重复下载? 答:使用沙盒缓存。 2、面试题 —— SDWebImage 底层是怎么实现? 答:使用沙盒缓存。同上。3、SDWebImage 默认缓存的时长是多少? 答:1周。4、当app接受...
  • 当我们使用Universal-Image-Loader在listview或者gridview中显示图片时,当快速滑动时,我们会看到图片一闪一闪的,那么怎么处理这么问题呢?我们在源码中找到了答案。 在源码中,我们发现了一个类...
  • 监控线程如何重启?

    2010-06-10 09:54:24
    我在做一个文件传输的功能,功能是一个监听线程(如下代码)监听一个文件下载队列就是doTranferFile()方法所做的事情,我将该方法抱在try和catch中防止由于异常将线程停止,但是由于一些不详的原因这个线程仍然会...
  • 在我们日常使用的应用中,很多应用都是按两次返回键才能退出,这是一种防止误触返回键的一种做法,那么这是怎么实现的呢?其实很简单,我们监听返回键,当按一次返回键,提示“再按一次退出”,当用户再次按返回键,...
  • 一看就懂TCP-连接

    2020-09-27 11:20:13
    三次握手目的是保证双方都有发送和接收的能力 首要原因是为了防止旧的重复连接初始化造成混乱。 同步双方初始序列号客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN 状态。然后客户端...
  • 面试篇三

    2019-03-18 03:16:30
    问题一:图片延迟加载是怎么实现的?...在js中,当监听到页面中的结构和数据都加载完成后(或者一个间隔时间),开始把图片的真实图片地址赋值给img中的src(为了防止图片地址不存在导致404错误,...
  • 负载均衡就是把多台服务器(阿里云服务器)联合起来,形成服务器集群,当用户访问量增大时,负载均衡服务器把流量分配给集群内的其他服务器,解决因为大流量产生的卡顿,失去响应,404等问题,也可以有效的防止DDOS...
  • 函数节流:节流,就是减少没必要的输出,就是防止一个函数没执行完,同个函数又开始执行了,性能的浪费。 防抖函数:短时间执行多次函数,等他们都执行完了就会一起刷新展示出来,导致页面抖动。 常用场景:重复点击...
  • //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。 window.onbeforeunload = function(){ websocket.close(); } //将消息显示在网页上 ...
  • 这是我第一个Java比较完整项目(上课的那种小例子可以不算项目),学会了怎么用JDBC,学会了Java的一般程序模型(DAO层、JavaBean、监听层、服务层、视图层等),了解了一个软件的开发和维护。总之实训结束的时候我...
  • 这里我的callbackId值对应的key就是callbackId,即在json消息的key-value形式中是这样的:callbackId : callbackId的值,这样我们就知道怎么从消息中去获取callbackId值了 2.配置CallbakcIdKeyFactory 定义好了...

空空如也

空空如也

1 2 3
收藏数 46
精华内容 18
关键字:

怎么防止监听