1.谈谈Java线程池使用的优势:
(1)Java线程池是一定数量的线程集合,线程的频繁创建与销毁消耗了操作系统与内存的大量资源,使用线程池使得减少了线程创建与销毁的资源浪费。
(2)使用线程池可以提高程序的响应速度,通过复用已存在的线程,无需等待新线程的创建便能立即执行。
(3)进行线程并发数的管控,过多的创建线程会使得造成系统内存过载溢出。
2.Java线程池的参数有哪些
线程池的方法参数:
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
(1)corePoolSize(线程池基本大小):当向线程池提交一个任务时,若线程池已创建的线程数小于corePoolSize,即便此时存在空闲线程,也会通过创建一个新线程来执行该任务,直到已创建的线程数大于或等于corePoolSize时,(除了利用提交新任务来创建和启动线程(按需构造),也可以通过 prestartCoreThread() 或 prestartAllCoreThreads() 方法来提前启动线程池中的基本线程。)
(2)maximumPoolSize(线程池最大大小):线程池所允许的最大线程个数。当队列满了,且已创建的线程数小于maximumPoolSize,则线程池会创建新的线程来执行任务。另外,对于无界队列,可忽略该参数。
(3)keepAliveTime(线程存活保持时间)当线程池中线程数大于核心线程数时,线程的空闲时间如果超过线程存活时间,那么这个线程就会被销毁,直到线程池中的线程数小于等于核心线程数。
(4)workQueue(任务队列):用于传输和保存等待执行任务的阻塞队列。
(5)threadFactory(线程工厂):用于创建新线程。threadFactory创建的线程也是采用new Thread()方式,threadFactory创建的线程名都具有统一的风格:pool-m-thread-n(m为线程池的编号,n为线程池内的线程编号)。
(6)handler(线程饱和策略):当线程池和队列都满了,再加入线程会执行此策略。
3.HTTP超文本传输协议中http1.0,http1.1,http2.0三种方式的优缺点
http超文本传输协议的底层是基于TCP/IP通信协议的,其传输效果受两个方面的影响,带宽以及延迟。
http1.0与http1.1二者的区别如下:
(1)缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
(2)带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
(3)错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
(4)Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
(5)长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点
http1.x与http2.0的区别:
(1)http2.0采用了新型的二进制解析格式,http.1.x采用的则是文本协议格式
(2)多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
(3)header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
4.HTTP传输协议与HTTPS传输协议的区别
(1)HTTPS协议需要使用CA证书,一般的CA证书没有免费的,HTTP协议运行在TCP之上,所有传输的内容都是明文,(2)HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。
(3)HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
(4)HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。
5.线程中的wait()与sleep()的区别是什么?
(1)sleep()与wait()都是使得线程暂停的办法,这两个方法来自不同的类分别是Thread和Object,sleep方法属于Thread类中的静态方法,wait属于Object的成员方法。
(2)sleep()是线程类(Thread)的方法,不涉及线程通信,调用时会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;wait()是Object的方法,用于线程间的通信,调用时会放弃对象锁,进入等待队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才进入对象锁定池准备获得对象锁进入运行状态。
(3)sleep()方法必须捕获异常InterruptedException,而wait()\notify()以及notifyAll()不需要捕获异常
通俗上来说就是:sleep()仅仅是线程让出了CPU,还在进行着监控,时间到达自动唤醒,同时保留着对象同步锁,但是wait()则是将对象同步锁进行了释放,同时见到了之后也需要noti()进行唤醒进入就绪队列。
6.Java高并发中的synchronized的使用:
sychronized是Java中最为常用与简单的解决高并发的,sychronized的三个重点作用:
(1)原子性:确保线程互斥的访问同步代码;
(2)可见性:保证共享变量的修改能够及时可见,其实是通过Java内存模型中的 “对一个变量unlock操作之前,必须要同步到主内存中;如果对一个变量进行lock操作,则将会清空工作内存中此变量的值,在执行引擎使用此变量前,需要重新从主内存中load操作或assign操作初始化变量值” 来保证的;
(3)有序性:有效解决重排序问题,即 “一个unlock操作先行发生(happen-before)于后面对同一个锁的lock操作”;
参考:
1.https://mp.weixin.qq.com/s/GICbiyJpINrHZ41u_4zT-A
标签:Java,工程师,创建,连接,传输,线程,sleep,日记 From: https://blog.51cto.com/u_13638291/6442028