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()
:任务是否已经被取消。