< 多线程 >
一、理解线程的还念
- 线程:
是CPU中运算和分配的基本单位,也是进程中运算的基本单位。一个进程可以有多个线程。一个线程可以独立完成一个顺序控制流程。 - 进程:
一个程序的运行实例,正在运行程序。通常说一个程序对应这一个进程。它由独立的内存空间和系统资源。
多线程和单线程(概念):
- 单线程 :如果一个程序中只有一个线程,则成为单线程
- 多线程:多个线程
多线程和单线程的区别:
- 1、多线程在执行时并不一定有单线程执行块
- 2、多线程产生的根本原因也是它的最根本的优势在于我们能够在一个程序中,同时干多件事,剋充分利用CPU资源
- 3、其实多线程有两个概念:一种指的是单核CPU的多线程,一种值得事多核CPU的多线程
– 多核CPU: 只执行一个线程,但是同样可以实现线程,这个多线程是“抢占 / 交替” 执行的
– 单核CPU: 可以进行交替执行,也可以实现真正物理上的并行执行
最经典的案例:迅雷
主线程
一个进程有且仅有一个主线程,主线程负责程序的开启和程序最后的关闭动作的线程
二、掌握线程的基本创建和启动
线程的第一种创建方式:
- 1、继承Thread 类
- 2、重写run();方法
- 3、创建线程对象 调用start()启动线程
线程的第二种创建方式【推荐使用】:
- 1、实现 Runnable 接口(Thread类也实现了此接口)
- 2、重写 run();方法 在其中编写对应线程的内容、
- 3、创建线程对象 组装Runnable 接口的实现类,调用start()方法启动线程
两种方法的区别:
启动start()和run()的区别?
- 如果是调用run();方法,它是指一个普通的方法,届时将只有在主线程在执行此方法而已(和以前其它方法调用效果无区别)
- 如果是嗲用start();方法,它会开启一个线程,然后此线程会和其他线程交替执行摩某些任务,此线程执行的内容就是run()方法内的任务
三、了解线程的集中状态
- 创建状态:当new Thread()时,线程处于创建状态
- 就绪状态:当调用start()之后,线程处于就绪状态
- 运行状态:当线程分配到CPU资源,线程处于运行状态
如果线程运行状态时,是处于抢占执行的,当没有抢到会回到就绪状态 - 死亡状态:当线程执行完任务,或者被外部干涉结束,线程会进入死亡状态
- 阻塞状态:当用户在输入/线程在休眠时,线程会进入组塞状态,当组塞状态结束后进入就绪状态
四、掌握线程调度的常用方法
线程优先级 getPriority(); setPriority();
线程休眠 sleep();
线程礼让 yield();
线程强制执行 join();
线程中断
……
五、掌握线程的同步问题(线程安全)
同时有多个线程在执行任务,虽然它们是交替执行,但是速度切换很快,如果一些资源被共享可能导致资源出错
线程并发
同一个资源被多个线程共享,可以通过“加锁”来解决问题。
- synchronized 同步
六、 常见的线程安全类型
- 1、StringBuffer 和StringBuilder
它们在使用中没有区别,但是StringBuffer是线程安全的,而StrinhBuilder非线程安全,效果较高 - 2、HashMap 和 Hashtable
Hashtable 是线程安全的 - 3、ArrayList 和Vector
Vector线程是安全的