Java多线程基础
基础
进程
- 一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。
- 一个进程一直运行,直到所有的非守候线程都结束运行后才能结束。
线程的生命周期
-
新建状态
- 一个新产生的线程从新状态开始了它的生命周期。它保持这个状态直到程序start这个线程。
-
就绪状态
- 当一个线程等待另外一个线程执行一个任务的时候,该线程就进入就绪状态。当另一个线程给就绪状态的线程发送信号时,该线程才重新切换到运行状态。
-
运行状态
- 当一个新状态的线程被start以后,线程就变成可运行状态,一个线程在此状态下被认为是开始执行其任务。
-
阻塞状态(休眠状态)
- 由于一个线程的时间片用完了,该线程从运行状态进入休眠状态。当时间间隔到期或者等待的事件发生了,该状态的线程切换到运行状态。
-
死亡状态(终止状态)
- 一个运行状态的线程完成任务或者其他终止条件发生,该线程就切换到终止状态。
创建线程三种方法
-
实现Runnable接口(最简单)
-
继承Thread类本身
-
方法
- start()
- run()
-
-
通过Callable 和 Future 创建线程
常见线程方法
-
sleep
- 当前线程暂停
-
join
- 加入到当前线程中
-
setPriority
- 线程优先级
-
yield
- 临时暂停
-
setDaemon
- 守护线程
同步问题
-
多个线程同时修改一个数据的问题
- 数据变成脏数据
-
又称为Concurrency(并发)问题
-
解决问题
-
synchronized 语句块
- 当前线程独占对象,直到释放占用
- 被 synchronized 修饰的,称为线程安全的类
-
Lock
-
图
-
常见线程安全类
-
Map
-
HashMap
- 非线程安全
- 可以存放null
-
HashTable
- 线程安全
- 不能存放null
-
-
字符串
-
StringBuilder
- 非线程安全
- 单线程速度快
-
StringBuffer
- 线程安全
- 多线程数据安全
-
-
List
-
ArrayList
- 非线程安全
-
Vector
- 线程安全
-
多线程编程
-
多线程能满足程序员编写非常有效率的程序来达到充分利用CPU的目的,因为CPU的空闲时间能够保持在最低限度。
-
主要概念
-
线程同步
-
互斥同步
- 一个时间点只允许一个线程访问代码段
-
条件同步
- 通过条件变量和三个操作来实现:等待,信号和广播
-
同步关键字
- synchronized
-
-
线程死锁
- 图
- 图
-
线程交互
-
wait
- 让占有this的线程等待,并临时释放占有
-
notify
- 通知等待this的线程苏醒,可以继续占有
-
notifyAll()
- 通知所有等待的线程
-
-
线程控制:挂起、停止和恢复
-
线程池
-
生产消费模式
- 对象为一个一个的任务
-
已创建的线程循环使用
-
-
多线程使用
- 有效利用多线程的关键是理解程序是并发执行而不是串行执行的。例如:程序中有两个子系统需要并发执行,这时候就需要利用多线程编程。
- 通过对多线程的使用,可以编写出非常高效的程序。不过请注意,如果你创建太多的线程,程序执行的效率实际上是降低了,而不是提升了。
- 请记住,上下文的切换开销也很重要,如果你创建了太多的线程,CPU花费在上下文的切换的时间将多于执行程序的时间。