提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、名词解释
1.1 进程
对运行时程序的封装,是系统进行资源调度和分配的基本单位,实现了操作系统的并发
进程之间不会相互影响
1.2 线程
是进程的子任务,是CPU调度和分派的基本单位,实现了进程内部的并发
1.3 上下文切换
CPU保存当前线程的本地数据、程序指针状态,并加载下一个要执行的线程的本地数据、程序指针状态
二、创建线程的方式
2.1 继承Thread类
class MyThread extends Thread {
@Override
public void run() {
// 线程执行的代码
}
}
// 创建并启动线程
MyThread thread = new MyThread();
thread.start();
2.2 实现Runnable接口
class MyRunnable implements Runnable {
@Override
public void run() {
// 线程执行的代码
}
}
// 创建并启动线程
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
2.3 使用匿名内部类
Runnable runnable = new Runnable() {
@Override
public void run() {
// 线程执行的代码
}
};
// 创建并启动线程
Thread thread = new Thread(runnable);
thread.start();
2.4 使用Java 8的Lambda表达式
Runnable runnable = () -> {
// 线程执行的代码
};
// 创建并启动线程
Thread thread = new Thread(runnable);
thread.start();
2.5 使用Executor框架
Executor executor = Executors.newFixedThreadPool(10); // 创建线程池
executor.execute(() -> {
// 线程执行的代码
});
三、run方法和start方法
3.1 run方法
是用来封装被线程执行的代码,手动调用相当于普通方法调用
3.2 start方法
启动线程,然后由JVM调用此线程的run方法
四、线程状态
NEW:线程尚未启动,还没有交给CPU去调度管理
RUNNABLE:线程正在执行中
BLOCKED:阻塞状态,等待锁的释放
WAITING:等待状态,需要其他线程唤醒
TIMED_WAITING:超时等待状态,线程等待一个具体的时间,超过时间会被自动唤醒
TERMINATED:终止状态,线程已结束或者遇到异常结束
五、影响线程间状态切换的API和场景
六、JMM:Java内存模型
线程对共享变量的操作都必须在自己的本地内存中进行,不能直接从主内存中读取
JMM主内存:属于共享数据区域,包含了堆和方法区
JMM本地内存:属于私有数据区域,包含了程序计数器、本地方法栈和虚拟机栈
顺序一致性模型:保证执行结果不变
顺序一致性模型:保证内存可见性
happens-before:两个操作存在该关系,那么第一个操作的结果对第二个操作可见
一个线程里的每一个操作,都happens-before任意后续操作
解锁happens-before加锁