一、理解程序、线程、进程
- 程序:program 是一个静态的概念
- 进程:process 是一个动态的概念
- 进程是程序的一次动态执行过程,占用特定的地址空间
- 每个进程都是独立的,由3部分组成cpu data code
- 缺点: 内存的浪费,cpu的负担
- 线程:Thread 是进程中的一个“单一的连续控制流程/执行路径”
- 线程又被称为轻量级进程
- 一个进程可拥有多个并行的线程
- 一个进程中的线程共享相同的内存单元/内存地址空间->可以访问相同的 变量和对象,而且它们从同一堆中分配对象->通信、数据交换、同步操作
- 由于线程的通信是同一地址空间上进行的,所以不需要额外的通信机制,这使得通信更简便而信息传递的速度也更快。
- 什么是多线程
- 如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为“多线程”
- 多个线程交替占用CPU资源,而非真正的并行执行
- 多线程好处
- 充分利用CPU的资源
- 简化编程模型
- 带来良好的用户体验
二、创建线程的两种方式-重点
1、extends 继承 Thread类,重写run方法。
class 定义类名 extends Thread{ @Override public void run(){ …… } }
启动线程:
Thread th = new Thread(自定义线程对象); th.start();
第二种定义线程方式:
new Thread(){ @Override public void run() { for(int i = 0; i < 10; i++){ System.out.println("线程二"); } } }.start();
2、implements 实现Runnable接口
class 自定义类 implements Runnable{ @Override public void run() { …… } }
启动线程:
Thread th = new Thread(自定义线程对象); th.start();
线程5个状态
1、创建状态
2、就绪状态
3、运行状态
4、阻塞状态
5、死亡状态
三、线程调度的几个方法
四、当并行、并发情况导致问题,用synchronized关键进行标识
将抢票情况做一个简单地模拟
当拥有线程锁机制synchronized时,其共同地资源num总票数并不会产生错误的情况。
当不拥有线程锁机制synchronized时,其共同地资源num总票数会因为并发的机制而产生错误。