Java Thread
Java Thread构造函数
数目很多,但是全部都会调用到private的6参构造方法
1234567891011121314151617181920212223242526272829303132333435363738public Thread() { this(null, null, "Thread-" + nextThreadNum(), 0);}public Thread(Runnable target) { this(null, target, "Thread-" + nextThreadNum(), 0);}public Thread(String name) { this(null, null, name, 0);}public Thread(ThreadGroup group, Runnable target) { this(group, target, "Thread-" + nextThreadNum(), ...
Java Process
Java基础之Process
进程属于是操作系统的资源,Java对其亦是开箱支持的
相关的类有
java.lang.Process
java.lang.ProcessBuilder
java.lang.ProcessHandle
Process
Process是一个抽象类,只有一套模板
1public abstract class Process
IO12345public abstract OutputStream getOutputStream();public abstract InputStream getInputStream();public abstract InputStream getErrorStream();
同步12// 使得当前线程一直等待,直到进程执行完毕public abstract int waitFor() throws InterruptedException;
1234567891011121314151617181920// 等待指定时间,超时即退出public boolean waitFor(long timeout, ...
Gradle之C/S通信
Gradle Connector连接建立
Client和Server通常运行在不同的进程,不同进程的通信最常用的就是socket。
确实Gradle也是使用的socket建立C/S的连接
对于Gradle来说一个连接既是
1234public interface Connection<T> extends Dispatch<T>, Receive<T>, Stoppable {}public class DaemonClientConnection implements Connection<Message> {}
所以如果想要创建连接即是实例化一个此类的对象。
DaemonClient.java
如下
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748public BuildActionResult execute(BuildAction act ...
HTTP缓存
HTTP缓存
参考自MDN文档
什么是HTTP缓存
缓存是一种思想。为了加速效率,把经常访问的内容保存下来。之后就不需要经过低效率的渠道获取内容从而提升效率。
缓存术语
缓存有效期(max-age)
数据是变动的,一旦缓存就要考虑数据的一致性,HTTP的协议制定者也不是傻子,也考虑到了这点,所以缓存是有一个时限的。
新鲜(fresh)
如果一个缓存在它的时限之内,则是新鲜的
过时(stale)
如果一个缓存在它的时限之外,则是过时的
共享缓存Public cache
缓存可能存放在公共网络中,即CDN等公共网络缓存设备可以对请求进行缓存(开发者应避免个人信息的泄露)
私有缓存Private cache
缓存可以存放在本地,这部分是用户独享。
存储Store respose
对可缓存的响应报文进行存储(存放不代表一定能复用)
复用Reuse response
缓存命中,使用缓存
验证Revalidate response
询问服务器当前持有的缓存是否过期(通常用于协商缓存)
新鲜响应Fresh response
缓存没有过期,可以使用
过期响应Stale resp ...
OkHttp全解析之Http & Websocket
Okhttp-http基础信息
依赖信息
1implementation("com.squareup.okhttp3:okhttp:4.10.0")
作用
可用于http及websocket的Http Client请求框架
关键概念
HTTP网络请求中涉及2个重要概念
Request
Response
即请求和响应
Okhttp的设计上为了贴合现实的网络请求,规划了5个类
OkHttpClient
客户端实体,可以进行网络请求细节的配置
Request
客户端网络请求报文
Response
服务端网络请求响应报文
Call
HTTP请求
WebSocket
Websocket请求
Okhttp做的很好的一点是使用者基本上只需要和上面几个类打交道
http请求
123456789val request = Request.Builder() .url("https://www.example.com") .headers(Headers.headersOf()) .metho ...
Gradle启动之Client
Gradle启动之Client
在本文以前,我们分析了
gradle批处理
gradle-wrapper
接下来我们需要分析
Gradle Client的启动过程
Pre基本概述
Gradle是C/S架构的一个java 程序
gradlew实际是用来启动gradle-client进程,
接着client进程会尝试连接后台的守护进程也即是gradle daemon,然后通过socket进行通信。
准备
即进行源代码调试方面相关的环境配置
Gradle既然是一个纯Java程序那么我们肯定是可以调试的。
参考自idea官方文档——remote debug
创建Remote Debug Configuration
Note:
在gradle源码工程创建,方便到时候直接连接。
保持默认配置
复制Command line arguments for remote JVM
1-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
agentlib: 指定java agen ...
Classloader全解析
关于本文
Java内置ClassLoader
Java ClassLoader加载过程
自定义ClassLoader
基本概念
A class loader is an java object that is responsible for loading classes. The class ClassLoader is an abstract class. Given the binary name of a class, a class loader should attempt to locate or generate data that constitutes a definition for the class. A typical strategy is to transform the name into a file name and then read a “class file” of that name from a file system.
Classloader是用于加载class的对象,接受一个class的binary name寻找或者生成该类的2 ...
Gradle启动之gradle-wrapper
Gradle启动之gradle-wrapper
gradle-wrapper即gradle的包装器。
gradle它完成了gradle的环境配置以及gradle的启动。(也就是说到这一步gradle才开始启动起来)
EntryPoint
前面分析到了,gradlew shell脚本执行java 程序启动了gradle-wrapper.jar,接着就从这里开始进行分析。
代码量还是比较少的。
美中不足的是没有gradle-wrapper的源代码,代码没注释可读性稍差,不过好在逻辑简单。就不去翻gradle源码了。
Notes:
如果对代码有洁癖的bro,可以打开gradle源代码
subprojects/wapper
subprojects/cli
subprojects/wrapper-shared
1234567891011121314151617181920212223242526272829public static void main(String[] args) throws Exception { //获取ja ...
Gradle启动之批处理
Gradle启动之批处理
Gradle启动无非是通过shell或者bat脚本,所有要看懂启动逻辑,先了解下基础语法
Shell基础变量自定义变量
变量定义
1variable="value"
定义非常简单,变量名=值,值得注意的是变量名和等号间不能有空格,名称必须遵循如下规则。
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线 **_**。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
变量使用
12echo $variableecho ${variable}
$variable即可,echo表示打印传入的值。
echo $variable表明打印变量
预定义特殊变量
$0:是指你所写的shell脚本本身的名字;
$1:是指你写的shell脚本所传入的第一个参数 ;
$2:是指你写的shell脚本所传入的第二个参数
$#: 传递到脚本或函数的参数个数
$*: 以一个单字符串显示所有向脚本传递的参数
$$: 脚本运行的当前进程ID号 ...
Gradle源码环境搭建
Gradle源码阅读环境搭建
接触了很长一段时间的gradle,也看过一部分源码,但是总是感觉差了点东西,所以重新阅读,并以写作的方式加深理解。
源码下载需要准备两个东西
gradle v7.6源代码
配置gradle-wrapper.properties
12345distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distsdistributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zipzipStoreBase=GRADLE_USER_HOMEzipStorePath=wrapper/dists
note:
一定要选择gradle-7.6-all,没有all表示只有二进制没有源文件,debug的时候就看不到源文件。
其中gradle v7.6源代码不是必须的,主要是为了防止idea抽风。有时候代码看不了。其实gradle-wrapper.properties配置的gradle-7.6-all.zip就已经包含了gr ...