前言:多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,还是值得深入研究一下
概念:
1 线程:进程中负责程序执行的执行单元
线程本身依靠程序进行运行
线程是程序中的顺序控制流,只能使用分配给程序的资源和环境
2 进程:执行中的程序
一个进程至少包含一个线程
3 单线程:程序中只存在一个线程,实际上主方法就是一个主线程
4 多线程:在一个程序中运行多个任务
目的是更好地使用CPU资源
线程的实现
线程实现方式有2种:
继承Thread类和实现Runnable接口(推荐使用)
继承Thread
public class VolatileTest extends Thread {
public void run(){
System.out.println("线程执行");
} public static void main(String[] args) {
new VolatileTest().start();
} }
实现Runnable
public class ConsumerWorker implements Runnable { public void run() { //执行逻辑
} }
通过调用start()方法来启动线程,注:调用run()方法也可以执行代码,但是并没有另起线程而是在原线程中执行逻辑(start()方法可以理解为,先创建一个线程,然后该线程执行run()方法)
线程的状态
- 创建(new)状态: 准备好了一个多线程的对象
- 就绪(runnable)状态: 调用了
start()
方法, 等待CPU进行调度 - 运行(running)状态: 执行
run()
方法 - 阻塞(blocked)状态: 暂时停止执行, 可能将资源交给其它线程使用
- 终止(dead)状态: 线程销毁
状态切换的方法
start:启动一个线程,当调用start方法后,系统才会开启一个新的线程来执行用户定义的子任务,在这个过程中,会为相应的线程分配需要的资源;由创建状态变为就绪状态
run:不需要用户来调用的,当通过start方法启动一个线程之后,当线程获得了CPU执行时间,便进入run方法体去执行具体的任务;由就绪状态变为运行状态
wait():在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行),由运行状态进入阻塞状态,释放锁
sleep():在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行),由运行状态进入阻塞状态,不释放锁
yield:让当前线程交出CPU权限,让CPU去执行其他的线程。它跟sleep方法类似,同样不会释放锁。但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。由运行状态改为就绪状态
join:主线程等待子线程执行完成之后再结束在进行
interrupt:暂停线程
线程的优先级
在操作系统中,线程可以划分优先级,优先级较高的线程得到的CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务。
======待续