2021年08月15日 课堂笔记
ReentrantLock重入锁
- ReentrantLock是JDK方法,需要手动声明上锁和释放锁
- ReentrantLock可设置内部 Condition,实现线程交互
- Renentrantlock能实现公平锁(默认非公平)
lock(), tryLock()加锁unlock()解锁newCondition()获得condition对象。
1 | ReentrantLock lock = new ReentrantLock(true); |
lock(),抢不到,则等待
tryLock(),抢不到,不等待,
Callable接口
- 创建线程的方法:
- 1.通过自定义
Thread子类 - 2.通过使用
Runnable接口 - run方法无法返回值
- 1.通过自定义
特点:
对于
Callable,需要实现call()方法支持泛型返回值
可以抛出异常
需要解决的问题
- 如何将返回值存储到主线程变量中
Callable接口并不能直接创建线程,只有Runnable接口可以,怎么办?
解决方法:借助Future接口接受线程返回值,其具体实现类FutureTask实现了Runnable接口,可以作为Thread的Target。
Future
Callable线程编程基本步骤
1.创建线程体类,实现Callable接口,重写Ca(()方法。
1 | class Thread Target implements Callable{} |
2.基于Callable对象,创建FutureTask对象
1 | ThreadTarget target = new ThreadTarget() |
3.基于FutureTask对象,创建线程对象,并启动
1 | Thread thread = new Thread(task); |
4.调用FutureTask,获取线程状态及返回值。(异步)
1 | Object result= task.get() |
Future接口主要方法
get()阻塞式,用于获取cabe行完后的返回值get(long timeout, TimeUnit unit): get()的重载方法用于最多等待的时间后,如仍未返回则线程将继续执行。cancel():撤销正在执行Callale的Task。isDone():是否执行完毕isCancelled():任务是否已经被取消。
Java线程池
Executor架构

