Java
文章平均质量分 84
秦汉春秋
“绝大多数人生活在一种平静的绝望之中”——梭罗
展开
-
Coap在Andorid中的简单应用
californium的简单应用,收发及组播。原创 2022-06-10 11:18:24 · 972 阅读 · 1 评论 -
Android端连接ActiveMQ服务器
记录一下Android作为客户端去连接ActiveMQ服务时,存在的问题。MQTTmqtt比较简单,有较为成熟的库MqttAndroidClient;repositories { maven { url "https://repo.eclipse.org/content/repositories/paho-snapshots/" }}dependencies { compile 'org.eclipse.paho:org.eclipse.paho.cli原创 2022-01-07 14:19:35 · 2301 阅读 · 0 评论 -
throttle/debounce应用及原理
“防抖”一词经常让人联想到“摄像头防抖”之类的技术,不过摄像头所说的防抖是补偿式、阻尼式的防抖动,是实实在在的防“抖动”,软件上的防抖动其实更多是指“控制频率”。软件上的防抖和节流虽然往往是一体的,但还是先大致分清其区别:防抖频次过高的数据丢掉,仅保留频次低的数据;节流单位时间或空间内,仅保留一次数据;两者均可以理解为按制定的规则过滤重复项,以达到控制事件触发频率的目的。防抖的规则是过滤掉频次过高的数据项,只要频次过高的数据均视为无效数据;节流的规则是每个单位时间内都要保留一次有效数据;原创 2021-04-02 10:54:24 · 1205 阅读 · 0 评论 -
写一个定时自检
有一个后台程序需要这么一个功能:需要知道自己什么时候进入稳定状态。我原来用一种沙雕方式实现的,即开一个线程让一个计数器定时自增,自增到某个数即表示已经进入稳定状态,如果中间有打破这种状态的操作,那么就让计数器重置为0: public static AtomicInteger STABLE_TIMER = new AtomicInteger(0); taskExecutors.exec...原创 2020-05-07 17:25:33 · 264 阅读 · 0 评论 -
关于线程池中终止任务
使用线程池本身删除或终止任务,有一个必须的前提:任务必须存在于队列之中。为什么这么说?是因为我们所谓的“删除任务”是指ThreadPoolExecutor的remove方法: public boolean remove(Runnable task) { boolean removed = workQueue.remove(task); tryTermi...原创 2020-04-27 17:22:42 · 8326 阅读 · 0 评论 -
JNA加载DLL及在jar中的运用
文章目录需求相关DLL相关JNA相关使用JNA加载DLL在jar中使用JNA加载DLL需求相关需求使用JNI方式加载DLL,并封装为SDK供他人使用。方法原生JNI方式调用JNA框架原生JNI方式适合自行定制的dll,也就是在拥有dll源码的情况下,可操作性比较强;不过如果方法太多以及涉及结构体之类,需要自己手写许多类型转换JNA通用于各种场景,在类型转换上比较省功夫,...原创 2020-02-05 16:48:17 · 4636 阅读 · 3 评论 -
class文件格式的理解
以前了解JVM相关知识时,对类文件结构仅仅是一瞥而过,并未仔细去深究,实在不应该。于是最近找了个闲暇,来仔细理解一下。先不谈各种定义,就现象而言,class文件只是开发者编译java文件产生的产物,且这个产物是供JVM阅读的。class文件于Java程序员自然随手可拾,当使用文本编辑器打开的时候却是这样的:cafe babe 0000 0034 003d 0a00 1100 2909001...原创 2019-12-14 12:27:50 · 642 阅读 · 1 评论 -
Netty在无Internet网络状况下的连接建立超时
首先记录下结果,都是寻找DNS的锅。测试代码: public void testFlow(){ EventLoopGroup group = new NioEventLoopGroup();// try { Bootstrap bootstrap = new Bootstrap() .group(group) ....原创 2019-11-12 17:40:16 · 387 阅读 · 0 评论 -
在Java中运行JS
不借助平台内置引擎(比如Android的WebView)运行JS原创 2019-10-14 17:14:06 · 1528 阅读 · 0 评论 -
关于定时上报数据的无头无尾问题
/** * 问题:为一组定时上报的消息加上开始与结束标志,即当一个消息不再定时上报时,作为其结束标志 */public class EndDemo { public static void main(String[] args) { EndDemo demo = new EndDemo(); try { for (int i = 0; i < 20; i++) {...原创 2019-10-12 16:03:16 · 266 阅读 · 0 评论 -
ByteBuffer注意事项
因为使用通信框架不同的缘故,bytebuffer这种东西在每个框架中都有可能是不同的,比如在Mina中叫IoBuffer,在Netty中叫ByteBuf,虽然叫法不同,但其实用法相似。有时候为了方便,就直接使用java内置的ByteBuffer了。所以了解ByteBuffer的使用,触类旁通也会变得很容易了。在一些容易混淆的问题产生之前,先复习一下常用场景下的基本使用。创建: public...原创 2019-09-15 16:44:10 · 590 阅读 · 0 评论 -
关于Netty的BlockingOperationException问题
记录遇到的一个死锁异常。出现的场景是在客户端断线重连时。重连时代码类似这样: private void reconnect() { if (bootstrap == null) throw new IllegalArgumentException("bootstrap cannot be null"); //如果已经连接,则直接【连接成功】 if (channel == nu...原创 2019-08-24 13:29:44 · 2001 阅读 · 0 评论 -
Netty的UDP广播发送与接收
想要的逻辑是这样的:A向局域网内发送广播消息messageA;B收到了messageA并直接使用既有的session或channel把需要回复的消息write回来就行了。自己尝试了一下,记载一下使用中较为便利的写法。客户端一般是这样写: EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); try { ...原创 2019-08-09 20:03:54 · 10319 阅读 · 8 评论 -
Java中的去重
最近都在匡扶汉室,无心写代码。说到去重,往往会想到filter、distinct之类的关键字。如果可以使用库的话,比如RxJava2中: Observable.just("aa", "bb", "ccc", "dd", "bb").distinct().subscribe(new Consumer<String>() { @Override public...原创 2019-08-01 14:28:09 · 2571 阅读 · 0 评论 -
并发——线程池的原理浅析
线程池可以用Executors直接创建,且分别拥有不同的特性,这些特性是怎么实现的呢?欢迎来到【read the fucking source code】环节。了解Executorspublic class Executors { /** * 使用一个无界队列创建一个重用固定数量线程的线程池。在任何时候,最多 * nthreads条线程可处于活动状态。如果在所有线程都...原创 2019-02-26 16:02:27 · 300 阅读 · 0 评论 -
有趣的字符版本号比较
就Android本身而言,其实大可不必比较字符版本号,Android系统本身升级应用的时候,也是由versionCode来判定版本大小的,而不是versionName。 defaultConfig { applicationId "com.xter.test" minSdkVersion rootProject.minSdkVersion t...原创 2019-03-17 11:53:58 · 374 阅读 · 0 评论 -
Java注解一二三
Java注解从了解到使用原创 2019-04-10 21:42:42 · 1280 阅读 · 1 评论 -
RxJava2常用的操作符
RxJava2常用操作符,比如map、interval、merge、debounce、filter...原创 2019-04-19 21:42:34 · 2366 阅读 · 1 评论 -
并发——synchronized、ReentrantLock的使用
这里都是以获得锁的方式来实现并发控制,是互斥的,阻塞的。synchronizedsynchronized在Java代码中用得非常多,也非常方便。首先明确两点:synchronized锁住的是对象synchronized是非公平的synchronized修饰方法代表锁住当前实例对象: public synchronized void method() { }以上代码等价于:...原创 2019-04-28 22:34:40 · 171 阅读 · 0 评论 -
Netty的断线重连
因为工作中经常使用到TCP,所以会频繁使用到诸如Mina或Netty之类的通信框架,为了方便项目的逻辑调用,经常会在框架的基础上再一次进行封装,这样做其实有画蛇添足的嫌疑,但也是无奈之举。/** * 提供重连功能,需传入bootstrap,并实现handlers */@ChannelHandler.Sharablepublic abstract class FunctionsChanne...原创 2019-05-31 17:24:20 · 10077 阅读 · 0 评论 -
从Netty源码看心跳超时机制
类似于Mina的sessionIdle,当Netty中的读写空闲(超时)后,会调用userEventTriggered方法,覆写这个方法就可以对心跳超时进行一定的逻辑处理。比如这样: @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (...原创 2019-06-13 15:54:12 · 1963 阅读 · 0 评论 -
从Mina源码看心跳超时机制
首先明确一点,在Mina或者其他相似的框架中,心跳机制肯定都是和计时挂钩的,只要找到计时相关的代码,其实就离真正的心跳逻辑不远了。Mina中的心跳超时其实都是指会话空闲,即在一定时间段内未接收或未发送消息的状态,此时会触发SessionIdle,也就是IoFilter中的方法。找到计时的地方,就很好理解了://AbstractPollingIoProcessor.java priva...原创 2019-06-10 20:26:38 · 1417 阅读 · 0 评论 -
从RxJava2源码看其工作流程
源码还是要多看看的。毕竟看源码与写代码的关系,就和多读书与写作文的关系一样。书读得多了,就会忘了。…所以还是记下来最好。先有一段普通的实现: Observable.just(1,23,4).map(new Function<Integer, String>() { @Override public String apply(Intege...原创 2019-06-21 20:39:12 · 133 阅读 · 0 评论 -
Mina伪装接收到心跳回复
在应用中,作为客户端,可能会遇到服务端不回复心跳的情况,那么这个时候就需要客户端自发自收。不必费力写一个定时器向自身发送心跳回复,直接在发送时调用其内部API就可以:public class KeepAliveGatewayZigbee implements KeepAliveMessageFactory { public static final String ROBOT_HEART =...原创 2019-07-05 16:24:45 · 561 阅读 · 0 评论 -
并发——线程池的使用
线程池是并发问题绕不开的,这辈子都绕不开,只能学会使用才能勉强运行这样子…基本调用Executors.newFixedThreadPool一个固定线程数量的线程池Executors.newSingleThreadExecutor一个光棍线程池Executors.newCachedThreadPool一个无上限的线程池Executors.newScheduledThreadPool...原创 2019-02-26 10:16:04 · 156 阅读 · 0 评论