前两天面试,被问到进程和线程的区别,由于是第一次面试软件测试岗,被问到这么“专业”的问题,有点惊讶,之后马上在脑海中努力回忆,还好能回答出7788。。总算没给自己专业丢脸
1.进程和线程的关系和区别
进程是一个程序在其自身的地址空间中的一次执行活动,是资源申请、调度和独立运行的单位。线程是进程的一个单一的连续控制流程,一个进程可以拥有多个线程。
线程调度的两种方式:抢占式、非抢占式。
进程和线程的区别在于,线程没有独立的存储空间,而是和所属进程中的其他线程共享一个存储空间。
一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。
资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。
处理机分给线程,即真正在处理机上运行的是线程。
线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
2.线程的状态
5个状态:新建、就绪、运行、阻塞/睡眠/等待、死亡。
线程间的通信一般用wait()方法、notify()方法、和notifyAll()方法。他们都是object类的最终方法,每个类都默认拥有。
3.多线程的实现方法
多线程有三种实现方法:
继承Thread类。
实现Runnable接口。利用继承Thread类创建的多个线程,虽然执行的是相同的代码,但彼此相互独立,且各自拥有自己的资源没互不干扰。而通过实现Runnable接口可以使多个线程拥有同一资源。
实现Callable接口。接口中要覆盖的方法是publiccall()注意:此方法可以抛异常,而前两种不能而且此方法可以有返回值
4.使用多线程的优缺点
多线程的优点是:提高并发程度、提高效率;缺点是数据同步困难、开发调试难、任意使用多线程会降低效率(过犹不及)
多线程的不利方面:线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
多线程需要协调和管理,所以需要CPU时间跟踪线程;
线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
线程太多会导致控制太复杂,最终可能造成很多Bug。
5.线程的run()和start()有什么区别?
每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。
start()方法来启动一个线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;这时此线程是处于就绪状态,并没有运行。然后通过此Thread类调用方法run()来完成其运行状态,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程终止。然后CPU再调度其它线程。
run()方法是在本线程里的,只是线程里的一个函数,而不是多线程的。如果直接调用run(),其实就相当于是调用了一个普通函数而已,直接待用run()方法必须等待run()方法执行完毕才能执行下面的代码,所以执行路径还是只有一条,根本就没有线程的特征,所以在多线程执行时要使用start()方法而不是run()方法。
6.什么是单线程和多线程
单线程是先执行完A再执行B。
多线程是A执行一段,B执行一段。然后共同完成。
举个很常见的例子来加深理解:
你正在刷朋友圈,你老妈微信语音给你,你是不是可以边听(假装在听)老妈的唠叨其实是在刷朋友圈根本没听老妈唠叨什么。这就是多线程。
如果你只能听老妈的唠叨啥事都不能干不能退出聊天界面,就是单线程。
测试实习面试时被问及的可不止这一个问题,更多面试题和经历可以看一下我的这篇?软件测试实习面试都问啥,实习相对来说要求没那么高,最重要就是自信点,准备充分点。然而秋招面试时除了会考察你知识面的广度还会考察你知识的深度,所以问的也会更深入问题也不同,需要的看这篇?秋招面试常考知识点
作者:lucky多多
原文链接:https://blog.csdn.net/weixin_41948075/article/details/89220359#comments_13635704