学习目标
- 多线程
同步代码块(使用synchronized关键字)。
同步方法:就是把synchronized关键字加到方法上
Lock锁机制(使用Lock接口下的实现类)。
- 使用线程本地存储ThreadLocal。
- 方法四:使用乐观锁机制。
1.3 线程池存在的优势 ?
- 降低资源消耗。减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
- 提高响应速度。当任务到达时,任务可以不需要等待线程创建﹐就能立即执行。
提高线程的可管理性。可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的
内存﹐服务器死机(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。
1.4 线程池能处理什么任务
- 线程池处理Runnable任务:多线程任务类型,首先自然想到的就是实现 Runnable 接口的类,Runnable接口提供了一个抽象方法run,这个方法无参数,无返回值。
线程池处理Callable任务:与 Runnable 类似, Callable 也只有一个抽象方法,不过该抽象方法有返回值。在实现该接口的时候需要制定返回值的类型。
1.5 线程有几种实现方式 ?
继承Thread类。
- 基本步骤:
- 创建一个类继承Thread类;
- 在类中重写run方法(线程执行的任务放在这里);
- 创建线程对象,调用线程的start方法开启线程;
- 执行程序,观察控制台的打印数据的现象。
- 实现Runnable接口;
- 基本步骤:
- 定义任务类实现Runnable,并重写run方法 ;
- 创建任务对象;
- 使用含有Runnable参数的构造方法,创建线程对象并指定任务;
- 调用线程的start方法,开启线程。
| | 优点 | 缺点 |
| —- | —- | —- |
| 实现Runnable | 扩展性强,实现该接口的同时还可以继承其他的类。 | 编程相对复杂,不能直接使用Thread类中的方法 |
| 继承Thread | 编程比较简单,可以直接使用Thread类中的方法 | 可扩展性较差,
不能再继承其他的类 |
- 实现Callable接口(需要利用线程池)。
1.6 线程间的通信能解决什么问题 ?
1)等待方法
void wait() 让线程进入无限等待。
void wait(long timeout) 让线程进入计时等待 。
以上两个方法调用会导致当前线程释放掉锁资源。
2)唤醒方法
void notify() 随机唤醒在此对象监视器(锁对象)上等待的单个线程。
void notifyAll() 唤醒在此对象监视器上等待的所有线程。
以上两个方法调用不会导致当前线程释放掉锁资源。
注意:
