JAVA并发编程基础(一)
该文章是阅读学习《JAVA并发编程的艺术》时写的一些简要知识点,只是一些概念性的东西加了些网上其他的资料,具体通过代码详解可详细阅读书本。
线程简介
线程概念
- 程序:是指含有指令和数据的文件,也就相当于静态的代码。
- 进程:进程就是程序的一次执行,是系统运行程序的基本单位,是系统资源分配的基本单位。
- 线程:线程是进程划分成的更小的运行单位。进程之间是独立的,线程之间可以共享内存,是可以相互影响的。
JVM中的线程与进程之间的关系(摘自JavaGuide):
在一个进程中可以创建多个线程,这些线程都拥有各自的程序计数器、虚拟机栈和本地方法栈,并且能够访问共享的内存变量。
为什么用多线程
- 更多地处理器核心
- 更快的响应时间
- 更好地编程模型
同样也会带来一些问题:例如内存泄漏、上下文切换、死锁还有受限于硬件和软件的资源闲置问题。
线程优先级
线程分配到的时间片多少决定了线程使用处理器资源的多少,而线程优先级就是决定线程需要多或者少分配一些处理器资源的线程属性。
通过在线程创建时调用setPriority(int) 方法来设置(范围1-10)。.
线程的状态
JAVA线程在运行的周期中可能处于图中的6个不同的状态,在给定的一个时刻只能处于其中之一。
JAVA线程在自身的生命周期中并不是固定地处于某个状态,而是随着代码的执行在不同状态之间进行切换。如图为线程状态变迁图:
启动和终止线程
启动线程
我们都知道启动线程是调用线程的 start() 方法,然后会执行run() 方法,这里有个面试会问到的为什么不直接调用run() 方法:
new一个Thread,线程进入了新建状态,调用start()方法,会启动一个线程并使线程进入就绪状态,当分配到时间片之后就可以运行了。start()会执行线程的相应准备工作,然后自动执行run()方法的内容,这是真正的多线程。直接执行run()方法,会当成一个普通的方法调用,不会在某个线程中执行。
中断线程
中断好比其他线程对该线程打了个招呼,其他线程通过调用该线程的interrupt() 方法进行中断操作。
线程通过方法isInterrupted()进行判断是否被中断。
过期的suspend、resume和stop
Thread的API中suspend()、resume()和stop()分别完成线程的暂停、恢复和终止工作,之所以过期的原因是对资源的占用释放问题容易导致发生问题,而暂停和恢复操作可以用到等待/通知机制来代替。