摘要:
CountDownLatch CountDownLatch用来使一个线程或多个线程等待到其他线程完成。CountDownLatch有个初始值count,await方法会阻塞线程,直到通过countDown方法调用使count减少为0才会执行await方法后面的代码。 示例代码 MyThread50_ 阅读全文
摘要:
Timer schedule(TimerTask task, Date time) 该方法在指定日期执行任务,如果是过去的时间,这个任务会立即被执行。 执行时间早于当前时间 示例代码,当前时间是2019年9月19日,代码中写的是前一天的时间。 运行结果如下 可以看到,过去的时间立即执行。 执行时间晚 阅读全文
摘要:
线程池类结构 1.Executor是顶级接口,有一个execute方法。 2.ExecutorService接口提供了管理线程的方法。 3.AbstractExecutorService管理普通线程,SchedulerExecutorService管理定时任务。 简单的示例 1.corePoolSi 阅读全文
摘要:
这里详细分析interrupt(),interrupted(),isInterrupted()三个方法 interrupt() 中断这个线程,设置中断标识位 我们来找下如何设置中断标识位的 找到interrupt0()的源码,src/hotspot/share/prims/jvm.cpp 调用了Th 阅读全文
摘要:
线程组 线程组可以批量管理线程和线程组对象。 一级关联 例子如下,建立一级关联。 输出结果如下 每隔三秒输出两个线程名称,符合预期。 线程组自动归组属性 java public class ThreadDomain49 { public static void main(String[] args) 阅读全文
摘要:
BlockingQueue BlockingQueue、解决了多线程中,如何高效安全“传输”数据的问题。程序员无需关心什么时候阻塞线程,什么时候唤醒线程,该唤醒哪个线程。 方法介绍 BlockingQueue是Queue的子类 void put(E e) 插入指定元素,当BlockingQueue为 阅读全文
摘要:
生产者消费者模型 生产者:生产任务的个体; 消费者:消费任务的个体; 缓冲区:是生产者和消费者之间的媒介,对生产者和消费者解耦。 当 缓冲区元素为满,生产者无法生产,消费者继续消费; 缓冲区元素为空,消费者无法消费,生产者继续生产; wait()/notify()生产者消费者模型 制作一个简单的缓冲 阅读全文
摘要:
读写锁ReentrantReadWriteLock概述 读写锁ReentrantReadWriteLock,使用它比ReentrantLock效率更高。 读写锁表示两个锁,一个是读操作相关的锁,称为共享锁;另一个是写操作相关的锁,称为排他锁。 1、读和读之间不互斥,因为读操作不会有线程安全问题 2、 阅读全文
摘要:
加锁和解锁 我们来看下ReentrantLock的基本用法 ThreadDomain35类 MyThread40_0类,增加线程 MyThread40_1类,减少线程 main方法,启动线程 输出结果如下 可以看到,lists的数量不会增加太多,也不会减少太多。当集合满,使增加线程等待,唤醒减少线程 阅读全文
摘要:
wait(),notify()和notifyAll()介绍 1.wait() 当线程执行wait()时,会把当前的锁释放,然后让出CPU,进入等待状态。 只能在同步方法调用wait()。 2.notify() 当执行notify/notifyAll方法时,会唤醒一个处于等待该对象锁的线程,然后继续往 阅读全文