-
目录
- 基本概念
- 常见线程的三种方法
- 线程并发
- 线程状态及状态转换
- 线程的不安全性
- 锁机制
-
基本概念
-
Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
-
多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。
-
这里定义和线程相关的另一个术语 - 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。
-
多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。
-
-
创建线程的三种方式@https://www.runoob.com/java/java-multithreading.html
-
Thread类
继承Thread类,
重写run(),
调用start()
-
Runnable接口(最常用)
创建一个实现 Runnable 接口的类
在类中重写run()方法
start运行
-
Callable接口
- 创建 Callable 接口的实现类,并实现 call() 方法,该 call() 方法将作为线程执行体,并且有返回值。
- 创建 Callable 实现类的实例,使用 FutureTask 类来包装 Callable 对象,该 FutureTask 对象封装了该 Callable 对象的 call() 方法的返回值。
- 使用 FutureTask 对象作为 Thread 对象的 target 创建并启动新线程。
- 调用 FutureTask 对象的 get() 方法来获得子线程执行结束后的返回值。
-
狂神说方法
-
-
线程并发
-
多个线程对同一个对象(数据)进行操作
TestThread5 -
存在数据访问安全问题
-
-
静态代理
-
Lamda表达式
- 尽量少使用,难以维护
-
线程状态及转换
-
状态
-
获取线程状态
thread.getState();
-
-
停止线程
- 线程休眠-sleep()
-
线程礼让_yeild
这仅仅是一种暗示,没有任何一种机制保证当前线程会将资源礼让。
-
线程强制执行_join
优先执行
-
优先级
并不一定是优先级高,先跑优先级高的
设置优先级应该优先于start
基本概念
-
-
守护线程
用户线程:我们平常创建的普通线程。
守护线程:用来服务于用户线程;不需要上层逻辑介入。
如果所有的用户线程都结束(不是RUN状态)了,那么守护线程就会被杀死。
设置守护线程
-
线程调度
-
线程同步
-
三个不安全的例子
多个人抢票
同一个账户取钱
对同一个List不断增加数据
-
同步方法与同步块
synchronized
默认锁的是this
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
死锁
死锁产生的条件![image-20210129151828084](/Users/luonaer/Library/Application Support/typora-user-images/image-20210129151828084.png)
死锁的例子
此时产生死锁:
此时无锁
LOCK锁
Synchronized与Lock的对比
使用ReentrantLock
-
-
生产者消费者
-
生产者生产,消费者消费。二者可并发执行,之间可以进行通信。
-
解决方法
-
管程法
-
信号灯法
-
-
线程池
-
提高性能,避免频繁的创建和删除线程
-
使用方法
-
代码实现
-
-