Java
ScottePerk
这个作者很懒,什么都没留下…
展开
-
Java多线程之 happens-before
happens-before用来保证两个操作直接的可见性。这里的两个操作,即可以在一个线程,也可以在多个线程中。1.如果一个操作happens-before另一个操作,那么第一个操作的执行结果,将对第二个操作可见。(保证可见性)而且第一个操作的执行顺序排在第二个操作之前。(JMM对程序做出的逻辑保障,并不是代码指令真正的执行保证)2.即使两个操作之间存在happens-before关系,并不意味着Java平台的实现必须要按照happens-before关系指定的顺序执行。因此,第一条是JMM对于程序原创 2022-06-30 16:05:27 · 366 阅读 · 0 评论 -
Java多线程 Future和FutureTask的使用和源码分析(全解析)
官方文档解释:Future表示一个异步计算的结果。并提供一些方法检测计算是否完成,等待完成,并取回数据。只有计算完成的时候,结果可以通过get方法获取。如果没有完成,则调用get方法的时候会阻塞。官方文档是这么写的,翻译起来有点奇怪。直接看源码更好理解,Future是一个接口,总共就5个方法。详细解释看注释。Future只是一个接口,他的一个最主要实现类是FutureTask。FutureTask实现了RunnableFuture,那么RunnableFuture接口又是什么呢?Runnable原创 2022-06-29 14:11:04 · 550 阅读 · 0 评论 -
Java多线程基础五 通过sleep防止CPU100%占用
在服务器中,会存在下面的while true方法,服务器需要一直接受请求,所以需要死循环一直运行着,如果没有添加sleep那么下面的代码会直接占用100%的cpu,导致别的应用没有执行权。这种情况叫做CPU空转如果加了sleep,哪怕sleep 1ms,cpu的占用率会降到3%左右(个人pc测试),总之就是会明显减低cpu使用率。while(true){ try { Thread.sleep(1); } catch (InterruptedException e) {原创 2022-04-19 02:17:19 · 2034 阅读 · 2 评论 -
Java多线程基础四 线程优先级之yield方法
yield单词是礼让的意思,是实现线程优先级的一种方式。线程调用yield会让出cpu的执行权,但别的线程不一定接受礼让。在cpu比较繁忙的时候效果明显,空闲的时候没什么影响。下面的例子,有A B两个线程,不断对count累加,B执行yield方法,B线程的count变量累加次数明显减少。没有yield方法的话,A B两个线程的累加次数差不多。/** * yield是礼让的意思,也就是让出线程cpu的执行权。 */public class YieldDemo1 { public stati原创 2022-04-19 01:53:58 · 1107 阅读 · 0 评论 -
Java多线程基础三 sleep的中断
在调用sleep方法的时候,我们需要try catch ,而catch的是InterruptedException这个异常,可以说这个异常就是sleep特定的异常。可以通过线程的interrupt方法手动打断。下面的代码在t1大约运行500ms的时候打断。/** * sleep的中断 */public class SleepDemo2 { public static void main(String[] args) { Thread t1 = new Thread("A")原创 2022-04-19 00:26:43 · 1391 阅读 · 0 评论 -
Java多线程进程二 sleep方法的状态切换
调用sleep方法的时候会导致线程的状态从RUNNING变为TIME_WAITING。本文专门写个例子验证这个情况。只是为了验证而验证,下面的代码没有什么实战意义。代码主要逻辑:创建t1线程对象,sleep 2000ms,在main线程输出t1线程的状态。main线程sleep 500ms为了确保t1比main先执行。其实就是卡时间点。最开始的时候可能是RUNNABLE也可能是TIMED_WAITING,因为没有sleep,谁先谁后不确定。500ms的时候t1很可能处于TIMED_WAITING状态原创 2022-04-18 23:57:56 · 548 阅读 · 0 评论 -
多线程基础一 线程的创建
方法一:直接使用Thread代码非常简单,开启三个线程输出线程自己的名称。/** * 创建线程方法一 */public class CreateThreadDemo1 { public static void main(String[] args) { Thread t1 = new Thread("A") { @Override public void run() { System.out.原创 2022-04-18 23:45:28 · 211 阅读 · 0 评论 -
开源库epublib使用详解
标题开源库epublib使用详解这个开源库是一个老外写的,我用这个写了一个epublib的swing阅读器。功能还是比较全的,目录解析和文本关联的功能都比较好实现。缺点就是没文档,不知道作者怎么想的。下面贴个实现的swing gui效果,还是有很多小问题。不过目录和文本都解析出来了,事件也能关联上。功能还是比较强的(指epublib这个库)。0.epub格式解析还是要从epub格式说起。epub文件本质上就是个压缩文件,可以通过解压软件直接解压。这是解压后的目录结构。进入text目录,里面是原创 2021-01-05 22:46:57 · 3272 阅读 · 2 评论 -
Fragment栈管理
1.基本栈管理定义两个Fragment并且分别实现他们的add,remove和repalce方法。public class MainActivity extends AppCompatActivity { private Fragment1 fragment1; private Fragment2 fragment2; private FragmentMana...原创 2019-10-11 16:36:17 · 1507 阅读 · 0 评论 -
精通多线程实战-CountDownLatch
万丈高楼平地起,要精通也要一步步开始。先来学习concurrent包下的CountDownLatch这个类。1.为什么先学这个类?答:实用。我觉得这个类在实际的项目中是很有用的。下面提出几个实际开发中经常遇到的问题,当然这些问题的解决方案是很多的,这里主要还是为了讲解CountDownLatch类的使用。可能存在更好的解决方案,但这里只提供CountDownLatch这种解决方案。...原创 2018-12-18 00:46:18 · 254 阅读 · 0 评论 -
GreenDao使用笔记
使用的GreenDao版本为3.2.21.引入GreenDao// 在根 build.gradle 文件中添加:buildscript { repositories { jcenter() mavenCentral() // add repository } dependencies { classpath 'co...原创 2018-10-30 11:50:55 · 229 阅读 · 0 评论