《JAVA多线程编程核心技术》第4,5,6,7章学习笔记

来源:互联网 发布:网络信号 英文 编辑:程序博客网 时间:2024/06/03 17:47

第四章Lock的使用

*ReentrantLock类
一般在共享资源内建立私有的 private Lock lock = new Reetrantlock();此为锁对象,在方法内调用lock.lock(),给下面的代码加锁,lock.unlock()解锁
*Condition类
在lock上获得Condition类,Condition condition = lock.newCondition(),调用condition的await()方法时线程在lock上阻塞,调用condition的signal方法唤醒在此condition上阻塞的一个线程,等待自己的线程释放锁,唤醒的线程参加下次竞争。condition的signalAll方法唤醒condition上的阻塞的所有线程

*公平锁与不公平锁
Lock分为公平锁和不公平锁,在创建lock时传入true(公平锁)和false(不公平锁),公平锁指的是线程的执行顺序与锁的加载顺序一致,也就说在如果几个线程同时抢一个锁,辣么阻塞队列的顺序就是他们的执行顺序,队列执行顺序为FIFO(frist in frist out)

本章节的方法
1.int getHoldCount()查询当前线程保持该锁的个数,也就是调用lock()的方法的次数
2.int getQueueLength()返回正在等待此锁的线程个数
3.int getWaitQueueLength(Condition condition)返回在此condition上阻塞的线程个数
4.boolean hasQueuedThread(Thread thread)查询指定的线程是否正确等待次所
5.boolean hasWaiters(Condition condition)查询是否有线程等待与此锁有关的condition条件
6.boolean isFair()判断是不是公平锁
7.boolean isHeldByCurrentThread()查询当前线程是否保持此锁定
8.boolean isLocked()查询此锁是否由任意线程保持
9.void lockInterruptibly():如果当前线程未被中断则获取锁定,如果被中断则出现异常
10.boolean tryLock(),仅在调用时,锁定未被另一个线程保持的情况下,才获得该锁定
11.boolean tryLock(long timeout,TimeUnit unit),在一定时间内试图获得锁,切此锁不能别其他线程保持,在该时间内此线程不能被中断
12.awaitUninterruptibly()如果为被中断则await
13.awaitUntil,线程在等待时间到达前可以被其他线程提前唤醒

*ReentrantReadWriteLock类
读写锁
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
lock.readLock读锁
lock.writeLock写锁

第五章定时器Timer
Timer timer = new Timer();
调用timer的schedule(new TimerTask(){},runDate,time)//runDate为TimerTask的第一次调用的开始时间,time为每多长时间循环一次
TimerTask的cancel方法为将自身从timer中移除
Timer的cancel将Timer的所有任务清空
Timer的scheduleAtFixedRate方法为有追赶特性的schedule方法,追赶特性为被开始时间抹去的需执行的task会补充执行

第六章多线程与单例
1.饿汉式
2.懒汉式
3.双重if加synchronized的懒汉式
4.使用枚举实现单利

第七章
线程的状态在Thread.state中
1.new
2.runnable
3.blocked
4.waiting
5.timed_waiting
6.terminated
通过调用thread.getState()
线程组,如果不为线程制定线程组,该线程会自动归属到创建此线程的线程组中,根线程组system,group.interrupt(),批量停止线程

线程的异常处理thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler(){……等等})
线程组的异常停止,继承ThreadGroup,重写UncaughtExceptionHandler方法

0 0