1. 理解线程的概念
**进程:**一个程序的运行实例,正在进行的程序。通常来说一个程序对应着一个进程,它有独立的内存空间和系统资源。
**线程:**是CPU中运算和分派的基本单位,也是进程中运算的基本单位。一个进程中可以有多个线程。一个线程可以独立完成一个顺序控制流程。
多线程和单线程概念
单线程:如果一个程序中只有一个线程,则称为单线程。
多线程:多个线程。
多线程和单线程的区别
- 多线程在执行时并不一定有单线程执行快。
- 多线程产生的根本原因也是它的最根本的优势在于我们能够在一个程序中,同时干多件事,可以充分利用CPU资源。
- 其实多线程有两个概念:一种是指单核CPU的多线程,一种是指多核CPU的多线程。
单核CPU:同时只能执行一个线程,但是同样可以实现多线程,这个多线程是抢占式/交替 执行的。
多核CPU:可以进行交替执行,也可以实现真正的物理上的并行执行。
主线程
一个进程有且仅有一个主线程,主线程是负责程序的开启和程序最后关闭动作的线程。
java.lang.Thread类
// 获取当前线程 the currently executing thread.
Thread currentThread = Thread.currentThread();
// 查看线程的名称
System.out.println(currentThread.getName());
// 设置线程的名称
currentThread.setName("小红");
System.out.println(currentThread.getName());
2. 掌握线程的基本创建和启动
线程的第一种创建方式
- 继承Thread类
- 重写run()方法
- 调用start()启动线程
线程的第二种创建方式
因为Java是单继承,所以如果你继承了Thread类,此类将无法再继承其他的父类。
- 实现Runnable接口
- 重写run()方法
- 创建线程对象 组装Runnable接口的实现类,调用start()方法启动线程
start()和run()的区别?
如果是调用run()方法,它只是一个普通方法,届时将只有主线程在执行此方法而已。(和以前的其他方法调用效果无区别)
如果是调用该start()方法,它会新开启一个线程,然后此线程将会和其他线程交替执行某些任务,此线程执行的内容就是run()方法内的任务。
3. 了解线程的几种状态
**创建状态:**当new Thread()时,线程处于创建状态。
**就绪状态:**当调用start()之后,线程处于就绪状态。
**运行状态:**当线程被分配到了CPU资源,线程处于运行状态,
如果线程运行状态时,是处于抢占式执行的,当没抢到时又回到就绪状态。
**死亡状态:**当线程执行完任务,或者被外部干涉结束,线程会进入死亡状态。
**阻塞状态:**当用户在输入/线程在休眠时,线程会进入阻塞状态,当阻塞状态结束后会进入就绪状态。
4. 掌握线程调度的常用方法
线程优先级
线程休眠
线程礼让
线程强制执行
线程中断…
5. 掌握线程的同步问题(线程安全)
同时有多个线程在执行任务,虽然它们是交替执行,但是速度切换很快,如果有一些资源被共享,可能导致资源出错。
线程并发
同一个资源被多个线程共享,可以通过“加锁”来解决安全问题。
synchronized同步
同步方法
public synchronized void saleTicket(){
}
同步代码块
synchronized(this){
}
6. 常见的线程安全类型
StringBuffer 和 StringBuilder。
它们在使用中没有区别,但是StringBuffer是线程安全的,而StringBuilder非线程安全,效果较高。
HashMap和Hashtable。
Hashtable是线程安全的。
ArrayList和Vector。
Vector是线程安全的。