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方法无法返回值

特点:

  • 对于Callable,需要实现call()方法

  • 支持泛型返回值

  • 可以抛出异常

  • 需要解决的问题

      1. 如何将返回值存储到主线程变量中
      1. Callable接口并不能直接创建线程,只有Runnable接口可以,怎么办?

解决方法:借助Future接口接受线程返回值,其具体实现类FutureTask实现了Runnable接口,可以作为ThreadTarget

Future

Callable线程编程基本步骤

1.创建线程体类,实现Callable接口,重写Ca(()方法。

1
class Thread Target implements Callable{}

2.基于Callable对象,创建FutureTask对象

1
2
ThreadTarget target = new ThreadTarget()
Future Task task = new Future Task(target);

3.基于FutureTask对象,创建线程对象,并启动

1
2
Thread thread = new Thread(task);
thread.start()

4.调用FutureTask,获取线程状态及返回值。(异步)

1
Object result= task.get()

Future接口主要方法

get()阻塞式,用于获取cabe行完后的返回值
get(long timeout, TimeUnit unit): get()的重载方法用于最多等待的时间后,如仍未返回则线程将继续执行。
cancel():撤销正在执行CallaleTask
isDone():是否执行完毕
isCancelled():任务是否已经被取消。

Java线程池

Executor架构

image-20210815101724705

image-20210815102136570

ThreadPoolExecutor类