- 博客(221)
- 资源 (16)
- 收藏
- 关注
原创 引入Timber 库 动态输出指定日志!收放自如!
模块会越来越多,不可能每个模块引入一次Timber.引入Timber库动态输出指定日志,故而弄成模块。封装成模块提供给其他模块调用!配置指定文件名来允许日志输出。日志只输出重点---只输出自己关心的文件名的日志。---在日志里点击带下划线的文件名就能定位到日志的关联代码位置。
2024-07-25 21:53:23
180
原创 Android 绑定服务的5个问题。
清单文件里package="com.centerm.cpay">这句话必须加上。gradle文件里的域名名字要改变下。
2024-06-04 11:14:45
1347
原创 使用 Android Jetpack 的 Room 部分将数据保存到本地数据库
Room 持久性库在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。具体来说,Room 具有以下优势:提供针对 SQL 查询的编译时验证。提供方便注解,可最大限度减少重复和容易出错的样板代码。简化了数据库迁移路径。
2024-05-22 20:27:00
613
原创 为什么TMD使用多线程?
Java多线程,音乐文件查找、HTTP请求处理、日志文件统计,使用多线程编程可以显著提升系统的响应速度和处理效率,避免单线程带来的性能瓶颈和用户体验问题。
2024-05-22 11:40:21
337
原创 如何在VISA非接里设置9F66?
2.在 VISA里设置一次,CapabilitiesInitializer.initializeCapabilitiesForTesting(this);为什么需要设置两次?1.在EP里设置一次。
2024-05-20 11:27:59
130
原创 如果你作 为Java程序员曾经遭遇过NullPointerException,请举起手
如果你作 为Java程序员曾经遭遇过NullPointerException,请举起手。
2024-05-07 16:34:05
227
1
原创 老人与海 the old man and the sea
i am glad we do not have to try to kill the starts.#世界名著#老人与海
2024-05-02 17:13:11
258
原创 认知驱动 对的东西,你就坚持,不需要想清楚。只要这件事情是有好处的,对别人、对自己有价值,有贡献和产出,你就坚持。人生所有的付出和经历,都会在未来的某一刻给你回报
认知驱动
2024-05-02 15:41:56
333
原创 等待超时模式
可以看出,等待超时模式就是在等待/通知范式基础上增加了超时控制,这使得该模式相比原有范式更具有灵活性,因为即使方法执行时间过长,也不会“永久”阻塞调用者,而是会按照调用者的要求“按时”返回。开发人员经常会遇到这样的方法调用场景:调用一个方法时等待一段时间(一般来说是给定一个时间段),如果该方法能够在给定的时间段之内得到结果,那么将结果立刻返回,反之,超时返回默认结果。前面的章节介绍了等待/通知的经典范式,即加锁、条件循环和处理逻辑3个步骤,而这种范式无法做到超时等待。上述描述等待超时模式的伪代码如下。
2024-02-27 08:59:29
390
转载 等待/通知机制
等待/通知机制,是指一个线程A调用了对象O的wait()方法进入等待状态,而另一个线程B调用了对象O的notify()或者notifyAll()方法,线程A收到通知后从对象O的wait()方法返回,进而执行后续操作。3)notify()或notifyAll()方法调用后,等待线程依旧不会从wait()返回,需要调用notify()或notifAll()的线程释放锁之后,等待线程才有机会从wait()返回。1)难以确保及时性。// 获取lock的锁,然后进行通知,通知时不会释放lock的锁,
2024-02-27 08:57:41
386
原创 volatile和synchronized关键字
Java支持多个线程同时访问一个对象或者对象的成员变量,由于每个线程可以拥有这个变量的拷贝(虽然对象以及成员变量分配的内存是在共享内存中的,但是每个执行的线程还是可以拥有一份拷贝,这样做的目的是加速程序的执行,这是现代多核处理器的一个显著特性),所以程序在执行过程中,一个线程看到的变量并不一定是最新的。关键字synchronized可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性。
2024-02-27 08:54:46
293
原创 安全地终止线程
这种通过标识位或者中断操作的方式能够使线程在终止时有机会去清理资源,而不是武断地将线程停止,因此这种终止线程的做法显得更加安全和优雅。在4.2.3节中提到的中断状态是线程的一个标识位,而中断操作是一种简便的线程间交互方式,而这种交互方式最适合用来取消或停止任务。在代码清单4-9所示的例子中,创建了一个线程CountThread,它不断地进行变量累加,而主线程尝试对其进行中断操作和停止操作。// 睡眠1秒,main线程对CountThread进行中断,使CountThread能够感知中断而结束。
2024-02-27 08:49:44
295
原创 过期的suspend()、resume()和stop()
大家对于CD机肯定不会陌生,如果把它播放音乐比作一个线程的运作,那么对音乐播放做出的暂停、恢复和停止操作对应在线程Thread的API就是suspend()、resume()和stop()。注意 正因为suspend()、resume()和stop()方法带来的副作用,这些方法才被标注为不建议使用的过期方法,而暂停和恢复操作可以用后面提到的等待/通知机制来替代。在代码清单4-8所示的例子中,创建了一个线程PrintThread,它以1秒的频率进行打印,而主线程对其进行暂停、恢复和停止操作。
2024-02-27 08:47:50
452
原创 JAVA线程 启动线程 理解中断
线程通过检查自身是否被中断来进行响应,线程通过方法isInterrupted()来进行判断是否被中断,也可以调用静态方法Thread.interrupted()对当前线程的中断标识位进行复位。中断好比其他线程对该线程打了个招呼,其他线程通过调用该线程的interrupt()方法对其进行中断操作。在代码清单4-7所示的例子中,首先创建了两个线程,SleepThread和BusyThread,前者不停地睡眠,后者一直运行,然后对这两个线程分别进行中断操作,观察二者的中断标识位。
2024-02-27 08:46:07
647
原创 在构建Daemon线程时,不能依靠finally块中的内容来确保执行关闭或清理资源的逻辑。
main线程(非Daemon线程)在启动了线程DaemonRunner之后随着main方法执行完毕而终止,而此时Java虚拟机中已经没有非Daemon线程,虚拟机需要退出。Java虚拟机中的所有Daemon线程都需要立即终止,因此DaemonRunner立即终止,但是DaemonRunner中的finally块并没有执行。Daemon线程被用作完成支持性工作,但是在Java虚拟机退出时Daemon线程中的finally块并不一定会执行,示例如代码清单4-5所示。代码清单4-5 Daemon.java。
2024-02-27 08:42:21
220
原创 线程的状态图
进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态,而超时等待状态相当于在等待状态的基础上增加了超时限制,也就是超时时间到达时将会返回到运行状态。当线程调用同步方法时,在没有获取到锁的情况下,线程将会进入到阻塞状态。阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态,但是阻塞在java.concurrent包中Lock接口的线程状态却是等待状态,因为java.concurrent包中Lock接口对于阻塞的实现均使用了LockSupport类中的相关方法。
2024-02-27 08:40:01
158
原创 java线程
现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行。线程开始运行,拥有自己的栈空间,就如同一个脚本一样,按照既定的代码一步一步地执行,直到终止。但是,每个运行中的线程,如果仅仅是孤立地运行,那么没有一点儿价值,或者说价值很少,如果多个线程能够相互配合完成工作,这将会带来巨大的价值。
2024-02-27 08:34:04
155
原创 java内存模型的基础
从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的副本。当线程A和线程B需要通信时,线程A首先会把自己本地内存中修改后的x值刷新到主内存中,此时主内存中的x值变为了1。随后,线程B到主内存中去读取线程A更新后的x值,此时线程B的本地内存的x值也变为了1。在消息传递的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。
2024-02-27 07:49:53
373
原创 volatile是如何来保证可见性的呢?
如果对声明了volatile的变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存。但是,就算写回到内存,如果其他处理器缓存的值还是旧的,再执行计算操作就会有问题。缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器对这个数据进行修改操作的时候,会重新从系统内存中把数据读到处理器缓存里。volatile的应用。
2024-02-26 07:59:20
398
原创 公众号回复idea能给出下载链接。
你可以使用字典来存储这些数据,然后在接收到消息时根据消息内容在字典中查找对应的回复内容。这样做不仅可以更优雅地管理多组数据,还可以轻松地扩展和维护。
2024-02-25 16:52:52
242
原创 今日头条自动点赞!
如果在滚动和重新寻找图片的过程中依然无法找到指定的图片,程序会继续循环,直到达到滚动次数的限制。在滚动后,程序尝试再次寻找指定的图片,如果找到了,就执行点击操作,并更新计数器,表示完成了一次点击任务。主要目的是在程序无法找到指定的图片时进行滚动页面或者刷新页面,然后重新尝试找到图片并点击。在进行页面刷新后,会将刷新次数加1,以便在未来的循环中对刷新次数进行判断,并可能采取不同的等待策略。语句块内部尝试寻找指定的图片,如果找到了则进行点击,并将计数器减1,表示完成了一次点击任务。
2024-02-25 13:45:33
308
原创 观察器(Observer)解决了什么问题?
如果有人说“好了,所有人都要检查自己,并可能要进行更新”,那么 Observable 类会执行这个任务——为列表中的每个“人”都调用 notifyObservers()方法。在Smalltalk 的MVC(模型-视图-控制器)的“模型-视图”部分中,或在几乎等价的“文档-视图结构”中,大家可以看到这个问题。若答案是肯定的,那么也修改自己的颜色,保持与点中那个箱子的协调。观察器(Observer)范式解决的是一个相当普通的问题:由于某些对象的状态发生了改变,所以一组对象都需要更新,那么该如何解决?
2024-02-23 18:20:49
294
原创 java 中什么是什么是Bean,解决了什么问题?为什么android开发中没用到?
2. **公共方法(Public Methods):** Bean类通常提供一系列公共方法来访问和修改私有字段,这些方法通常遵循一定的命名约定,比如getXxx()和setXxx()。1. **封装数据:** Bean通过将数据封装在私有字段中,并提供公共方法来访问和修改这些数据,可以有效地隐藏数据的实现细节,从而提高了代码的安全性和可维护性。2. **统一访问方式:** Bean提供了一种统一的访问方式,使得不同的类可以以相似的方式来访问和操作数据,这样就可以减少代码的重复性和冗余性。
2024-02-23 18:14:41
214
原创 迭代器是干什么的?为什么需要他?
put(Object key, Object value)添加一个值(我们希望的东西),并将其同一个键关联起来(想用于搜索它的东西);而 elements()产生对所有值的一个枚举。这种“从一系列对象中选择”的概念亦可叫作一个“映射”、“字典”或者“关联数组”。堆栈就是这样的一个例子:它的选择标准是“最后压入堆栈的东西”。有时候,我们需要一个一个地访问集合中的每个元素,就像你一个一个地拿出盒子里的玩具一样。迭代器就像是一个指示器,可以帮助我们逐个访问集合中的元素,这样我们就可以处理集合中的每个元素了。
2024-02-23 18:10:50
257
原创 集合是干嘛的?解决了什么问题?
有些时候甚至想用更复杂的方式来保存对象。为解决这个问题,Java 提供了四种类型的“集合类”:Vector(矢量)、BitSet(位集)、Stack(堆栈)以及。“关联数组”,允许我们将任何对象关联起来。除此以外,所有Java 集合类都能自动改变自身的大小。所以,我们在编程时可使用数量众多的对象,与拥有集合功能的其他语言相比,尽管这儿的数量显得相当少,但仍然能用它们解决数量惊人的实际问题。这些集合类具有形形色色的特征。例如,Stack 实现了一个 LIFO(先入先出)序列,而 Hashtable 是一种。
2024-02-23 18:07:47
201
原创 内部类能覆盖吗?内部类解决了什么问题?
内部类对我们非常有用,因为利用它可对那些逻辑上相互联系的类进行分组,并可控制一个类在另一个类里的“可见性”。然而,我们必须认识到内部类与以前讲述的“合成”方法存在着根本的区别。在本章的末尾,介绍完内部类的所有语法之后,大家会发现一个特别的例子。通过它应该可以清晰地认识到内部类的好处。在Java 1.1 中,
2024-02-23 17:33:22
260
原创 更换公众号人工服务提示!
n这里是ChatGPT,如何需要人工服务,请加微信:AIGPTchina",找到目录下 /root/data/chatgpt-on-wechat/config.json 文件。
2024-02-23 16:47:36
114
原创 为什么需要抽象类和接口?
抽象类和接口都有自己的适用场景和优劣势,根据具体情况选择使用哪种方式。通常情况下,应该首选接口而不是抽象类,以便更好地利用Java的接口多继承特性。“过载”是指同一样东西在不同的地方具有多种含义;而“覆盖”是指它随时随地都只有一种含义,只是原先的含义完全被后来的含义取代了。
2024-02-23 09:02:15
332
原创 java多态的本质----将发生改变的东西同没有发生改变的东西区分开
在一个设计良好的 OOP 程序中,我们的大多数或者所有方法都会遵从tune()的模型,而且只与基础类接口通信。我们说这样的程序具有“扩展性”,因为可以从通用的基础类继承新的数据类型,从而新添一些功能。即使 tune()位于一个独立的文件里,而将新方法添加到Instrument 的接口,tune()也能正确地工作,不需要重新编译。可以看到,在围绕 tune()方法的其他所有代码都发生变化的同时,tune()方法却丝毫不受它们的影响,依然故我地正常工作。新方法是what()和adjust()。
2024-02-23 08:42:21
161
原创 在jar里限制指定的包名才可调用(白名单)。
3. 将当前应用的hash值与预设的值进行比较,如果匹配,则允许调用接口;1. 在jar包中定义一个接口,例如 用于检查传入的hash值是否匹配预设的值。2. 在调用接口的地方,获取当前应用的hash值。
2024-02-22 17:57:04
553
原创 每个java文件里都定义TAG变量-冗余的解决办法!
因为每个java文件都需要打印日志。获取调用位置的类名来替换LOG打印日志里的TAG变量。每个java文件里都得写一句这样得话来打印日志。
2024-02-22 17:32:31
107
doc转pdf工具(word转pdf)
2011-03-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人