多线程基础
Posted depthch
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程基础相关的知识,希望对你有一定的参考价值。
多线程是企业面试必备题,尤其是中级和高级程序员,基本上百分百都会考多线程。
现在很多系统(windows,macOS,Linux)都可以执行多任务,比如同时运行:QQ、音乐、浏览器,电脑中CPU执行代码都是一条一条顺序执行的,但是,即使是单核cpu,也可以运行多个任务。因为操作系统执行多任务实际上就是让CPU对多个任务轮流交替执行
列如,我们现在要做三样事情:洗碗、洗衣服、做作业,假如每件事情都要20分钟才能做完,如果一个人在洗碗的同时抽空一边洗衣服和写作业,这样轮流做下去就像是三个人同时一起做这三件事情。
线程与进程的区别
什么是进程?
在计算机中,我们把一个任务称为一个进程,在电脑上每打开一个应用程序,CPU就会创建一个进程,在一个应用程序运行的过程中,至少会有一个进程。
进程是执行中的程序,一个操作系统可以有多个进程,任何一个软件只要能运行起来,那么它肯定有一个进程展示的
我们在电脑上打开"任务管理器",可以看到我们电脑上正在运行的进程
现在打开一个QQ,再来看任务管理器,
什么是线程?
有些进程内部还需要多个子任务,列如,我们使用电脑管家的时候,可以同时进行垃圾清理和系统扫描,我们把子任务称为线程。
在一个进程中,一定有一个线程,这个线程就是主线程。
进程:正在运行的程序,他是线程的集合,由至少一个或多个线程组成。
线程:进程中独立运行的一条执行路径
在进程中,程序代码是怎么执行的?
使用多线程,可以提高程序运行效率,多个线程之间互不影响,因为都在自己独立运行。
为什么要使用多线程?
为了提高程序效率,多线程就类似N个工人"同一时间"去干同一件事情,比一个人"同一时间"去干快N倍
多线程的应用场景
多线程下载、QQ、爬虫、前端开发ajax(异步上传)
拿爬虫来说,我们在请求网页的时候就可能会出现延迟或超时,这时如果是单线程的话,就会一直等待请求响应,这样就会浪费很多实际,很大程度降低了程序效率。如果使用的是多线程的话,当第一个请求延迟了,cpu就会先去执行第二个请求或其他请求,不需要等待第一个请求是否延迟,因为每条子线程执行的过程是互补干扰的。
什么是同步?什么是异步?
同步(单线程):代码按顺序执行一条一条下来。
异步(多线程):同时多个任务一起执行,每个任务互不干扰。
创建线程有哪些方式?
1.使用继承Thread类方式 继承Thread重写run方法
class DemoThread01 extends Thread
{
public void run()
{
// 需要执行的代码
}
}
测试代码:
new DemoThread01().start() //启动线程
2.使用实现Runnable接口方式
class DemoThread02 implements Runnable
{
public void run()
{
// 需要执行的代码
}
}
测试代码
DemoThread02 run = new DemoThread02();
new Thread(run).start() //启动线程
3.使用匿名内部类方式
Thread thread = new Thread(new Runnable() {
public void run() {
//需要执行的代码
}
});
thread. start() ; //启动线程
Thread常用API
getId() 获取线程id
currentThread() 获取当前线程对象
getName() 获取线程名称
sleep() 线程休眠
常用线程构函数
Thread() 分配一个新的Thread对象
Thread(String name) 分配一个新的Thread对象,具有指定的name正如其名
Thread(Runnable r) 分配一个新的Thread对象
Thread(Runable r,String name) 分配一个新的Thread对象,具有指定的name正如其名
守护线程和非守护线程
什么是守护线程、非守护线程?
守护线程,和main相关。
用户线程,用户自己创建的线程,用户创建线程,如果主线程停止掉,不会影响用户线程
守护线程,有一个特征:和主线程一起销毁。
非守护线程特征:和主线程互不影响
创建守护线程? Thread对象调用setDaemon(true)方法,参数为true,可以将该线程设置为守护线程
多线程运行状态
新建—>就绪—>运行—>休眠—>死亡
当我们创建一个Thread对象时就是新建状态
调用start()方法后线程并不会马上运行,而是处于一个就绪状态,它需要等待拿到cpu的执行权之后才真正运行,休眠状态在我们调用sleep方法的时候线程就处于一个休眠状态,当所有任务执行完毕后线程就停止了,就是死亡状态
join方法介绍
join方法的作用? 当线程A调用线程B的join方法后,线程A就需要等待线程B执行完毕之后再继续执行。
好比我们现在需要 洗衣服和晾衣服,这时要晾衣服的人就必须等待洗衣服的人洗完才可以晾衣服。
以上是关于多线程基础的主要内容,如果未能解决你的问题,请参考以下文章