首页 > 编程语言 >Java开发工程师学习日记(十)

Java开发工程师学习日记(十)

时间:2023-06-08 18:07:25浏览次数:37  
标签:Java 工程师 创建 连接 传输 线程 sleep 日记


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(线程饱和策略):当线程池和队列都满了,再加入线程会执行此策略。

Java开发工程师学习日记(十)_http

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

相关文章

  • Java语言实现生产者与消费者的消息队列模型(附源码)
    Java构建生产者与消费者之间的生产关系模型,可以理解生产者生产message,存放缓存的容器,同时消费者进行消费需求的消耗,如果做一个合理的比喻的话:生产者消费者问题是线程模型中的经典问题。解决生产者/消费者问题有两种方法:一是采用某种机制保护生产者和消费者之间的同步;二是在生产者和......
  • 一文读懂大厂面试的JAVA基础(集合,面向对象特性,反射,IO,容器)
    整理了操作系统,计算机网络,以及JVM的高频面试题目,对于面试大厂的Android以及后端开发岗位,可以说的是十分必要的部分就是JAVA语言的基础,在整体的内容上我认为有以下的几个部分,我发现任何的学习都是先建立框架体系,再逐个击破,针对Java的基础中包括:(1)Java语言的面向对象的特性(2)Java语言......
  • Java面试题查缺补漏习题,锁的升级,动态代理
    之前我们总结了Java面试题目中的关于计算机网络,操作系统,以及JVM虚拟机,以及Java的相关特性。今天又看了很多面试的视频,对面试的题目进行一下仔细的补充。1.对称加密与非对称加密的区别:非对称加密和对称加密在加密和解密过程、加密解密速度、传输的安全性上都有所不同,具体介绍如下:......
  • Java开发工程师学习日记(九)
    1.TCP与UDP网络传输协议方面:TCP的传输报文形式比UDP的传输形式更加复杂,因此UDP头部只有四个字段,因此传输效率比较,TCP<UDP2.数组或者字符串的null值含义:null表示字段或者变量还没有确定的值,3.IP地址的分类:A类:0.0.0.0~127.255.255.255B类:128.0.0.0~191.255.255.255C类:192.0.0.0~......
  • 你是这样的“夜间工程师”吗?(深度好文)
    其实今天说的这个标题,是我自己的一个反思,我现在发现自己的作息时间有一点问题,我们可以看到各大互联网公司的出了名的加班时间表,尤其是某为,某节几个公司的加班都是出了名的多。正就是所谓的互联网的狼性所在~我其实在想为什么会选择在夜间加班呢?而且不仅仅夜间加班,在白天感觉也是非......
  • java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal al
    一、报错及部署环境Java程序访问测试域名https方法正常,访问生产域名https域名报错,报错如下javax.net.ssl.SSLHandshakeException:Receivedfatalalert:protocol_version测试环境使用KubeSphereingress生产环境使用阿里云ACK服务的ingress配置二、问题原因客户端......
  • Java中枚举类的特殊用法-使用枚举实现单例模式和策略模式
    上面针对枚举类实现单例模式和策略模式有所涉及,下面补充。Java中使用枚举类实现单例模式为什么可以这样做?枚举类不能new,因此保证单例枚举类不能被继承类不加载时,不会实例化使用枚举类创建的单例还有一个好处,就是即使使用反射,也无法打破它的单例性质新建枚举类publicenumSingleEn......
  • Java基础之基础语法与面向对象
    前言小知识Java由Sun公司于1995年推出,2009年Sun公司被Oracle公司收购,取得Java的版权Java之父:JamesGosling(詹姆斯·高斯林) 专业术语JDK:javadevelopmentkit(java开发工具包)JRE:javaruntimeenvironment(java运行环境)JVM:javavirualma......
  • el-api包冲突,java.lang.LinkageError: loader constraints violated when linking ja
    java.lang.LinkageError:loaderconstraintsviolatedwhenlinkingjavax/el/ExpressionFactoryclass严重:Servlet.service()forservletjspthrewexceptionjava.lang.LinkageError:loaderconstraintsviolatedwhenlinkingjavax/el/ExpressionFactoryclassat......
  • java reflection Java 反射,动态绑定
    javareflection,java反射,动态绑定                                       Reflection是Java程序开发语言的特征之一,它允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得Java类中......