二面:
1、线程与进程的区别?
一:进程与线程
概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程。当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程。
进程:进程是指处于运行过程中的程序,并且具有一定的独立功能。进程是系统进行资源分配和调度的一个单位。当程序进入内存运行时,即为进程。
线程:
线程是进程的组成部分,一个进程可以拥有多个线程,而一个线程必须拥有一个父进程。线程可以拥有自己的堆栈,自己的程序计数器和自己的局部变量,但不能拥有系统资源。它与父进程的其他线程共享该进程的所有资源。
线程的特点:
线程可以完成一定任务,可以和其它线程共享父进程的共享变量和部分环境,相互协作来完成任务。
线程是独立运行的,其不知道进程中是否还有其他线程存在。
线程的执行是抢占式的,也就是说,当前执行的线程随时可能被挂起,以便运行另一个线程。
一个线程可以创建或撤销另一个线程,一个进程中的多个线程可以并发执行
二、线程的创建及使用
方案一:继承Thread类创建线程类
步骤:① 定义Thread类的子类 并重写该类的Run方法,该run方法的方法体就代表了该线程需要完成的任务
② 创建Thread类的实例,即创建了线程对象
③ 调用线程的start方法来启动线程
public class ThreadTest extends Thread{
private int i;
@Override
public void run() {//重写run方法
for (int i = 0; i < 10; i++) {
//获取当前正在执行的线程名
System.out.println(getName()+"\t"+i);
}
}
}
public class MyTest{
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("调用线程"+Thread.currentThread().getName()+"\t"+i);
if(i==5) {
ThreadTest t1=new ThreadTest();
ThreadTest t2=new ThreadTest();
//开启线程
t1.start();
t2.start();
}
}
}
}
方案二:实现Runnable接口
①定义Runnable接口的实现类,并重写它的Run方法,run方法同样是该线程的执行体!
②创建Runnable实现类的实例,并将此实例作为Thread的target创建一个Thread对象,该Thread对象才是真正的线程对象!
public class TwoThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("调用线程"+Thread.currentThread().getName()+"\t"+i);
if(i==10)
System.out.println(Thread.currentThread().getName()+"执行完毕");
}
}
}
2、打开一个url,发生了什么?
基本概念:我们想要打开一个网站,首先是需要往浏览器的地址的URL输入框架中输入网地址。当我敲下回车后,通过HTTP协议,将网址传送到域名解析服务器,域名解析服务器根据网址找到对应的IP主机(系统服务器)。这个过程叫request,即请求;当IP主机拿到请求后,将相应的资源返回给用户浏览器。这个过程叫response,即响应。
当用户浏览器向系统服务器请求时,有几种方法,最常用的就是GET和POST两种方法。
3、http的请求方式?
get和post区别
区别:
get请求无消息体,只能携带少量数据
post请求有消息体,可以携带大量数据
携带数据的方式:
get请求将数据放在url地址中
post请求将数据放在消息体中
GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中;
GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
4、http协议工作过程?
一次HTTP操作称为一个事务,其工作整个过程如下:
1 ) 、地址解析
如用客户端浏览器请求这个页面:http://localhost.com:8080/index.htm
从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下:
协议名:http
主机名:localhost.com
端口:8080
对象路径:/index.htm
在这一步,需要域名系统DNS解析域名localhost.com,得主机的IP地址。
2)、封装HTTP请求数据包
把以上部分结合本机自己的信息,封装成一个HTTP请求数据包
3)封装成TCP包,建立TCP连接(TCP的三次握手)
在HTTP工作开始之前,客户机(Web浏览器)首先要通过网络与服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。这里是8080端口
4)客户机发送请求命令
建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可内容。
5)服务器响应
服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
实体消息是服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据
6)服务器关闭TCP连接
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码
Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
5、代码实现二叉树的高度(自己建树)
6、长连接,短连接,http1.0 http1.1。
http协议过程:
一次完整的请求过程:
(1)域名解析
(2)建立TCP连接,三次握手
(3)Web浏览器向Web服务端发送HTTP请求报文
(4)服务器响应HTTP请求
(5)浏览器解析HTML代码,并请求HTML代码中的资源(JS,CSS,图片)(这是自动向服务器请求下载的)
(6)浏览器对页面进行渲染呈现给客户
(7)断开TCP连接
HTTP 1.1在继承了HTTP 1.0优点的基础上,也克服了HTTP 1.0的性能问题
8、描述socket通信过程,每个函数。
9、解释抓包和构造包的过程。
10、i++和++i哪个效率高,有什么区别。
i++是先把i的值拿来用,然后在自增1
++i是想把i自增1然后拿来用
内建数据类型的情况,效率没有区别。
自定义数据类型的情况,++i效率较高。
12、线程间的同步方式。
13、扑克牌洗牌算法(提示用队列实现)
14、java/C++内存管理方式。
15、列举STL容器,解释vector和list.