等待唤醒机制
计时等待(Timed Waiting)
- 调用静态的
sleep(long millis)
方法,可用于单线程。 - 与锁无关,线性睡眠到期自动苏醒,返回到Runnable(可运行)或阻塞状态。
- 锁阻塞状态(Blocked)为某个线程争夺CPU执行权的过程,,成功后可运行。
无限等待(Waiting)
-
拥有对象监视器的线程在调用
waiting()
方法后进入无限等待状态,直到其他在该锁对象上的线程调用notify()
方法将其唤醒。两者均为Object
类方法。 -
wait(long m)
同sleep(long millis)
方法,但其可在睡眠结束前被唤醒。 -
notifyAll()
方法可唤醒在当前对象监视器上等待的所有线程。 -
等待和唤醒的线程只有一个能执行,因此需要使用同步。
线程池
概述:存放线程的容器,本质上为一个LinkedList<Thread>
集合。其中的线程可以反复使用,以免反复创建线程而消耗资源。
使用步骤:
- 使用线程池的工厂类Executors中的静态方法
static ExecutorService newFixedThreadPool(int nThreads)
生产一个指定线程数量的线程池。返回值即一个线程池接口的实现类对象。 - 创建一个类实现
Runnable
接口,设置线程任务。 - 调用
ExecutorService
线程池接口中的submit(Runnable task)
方法传递线程任务即实现类,执行run方法。 - 可调用
ExecutorService
中的shutdown()
方法销毁线程池(不建议)。
Lambda表达式
概述:简化匿名内部类的书写方法,不重视过程只看结果(即执行重写的方法体)。
使用前提:
- 必须具有接口,且其中只能有一个抽象方法。(函数式接口)
- 必须能够通过上下文推断。
格式:
(参数列表)->{重写的方法体}
注意:
- 小括号内无参数则留空,参数类型可省略。
- 若仅有一个参数,则小括号可省略。
- 若大括号内只有一个语句,则可以同时省略(大括号,return关键字,分号)。必须一起省略。