JDK 规范目录(http://www.javashuo.com/article/p-wdnembkc-ex.html)html
user.home
用户目录,如 Linux 上 root 的用户目录为 /rootuser.dir
项目工做目录java.net 包下有几个核心的类:java
URL URLConnection URLStreamHandler URLStreamHandlerFactory
经过 URLStreamHandlerFactory 获取 URLStreamHandler,经过这个 Handler 获取 URLConnection,进而操做各类网络资源。react
JDK 1.8 中 URLStreamHandlerFactory 有一个默认的实现类 Factory,这个类是 Launcher 的内部类,代码以下:spring
private static URLStreamHandlerFactory factory = new Factory(); private static class Factory implements URLStreamHandlerFactory { private static String PREFIX = "sun.net.www.protocol"; public URLStreamHandler createURLStreamHandler(String protocol) { String name = PREFIX + "." + protocol + ".Handler"; try { Class<?> c = Class.forName(name); return (URLStreamHandler)c.newInstance(); } catch (ReflectiveOperationException e) { throw new InternalError(e); } } }
能够看到 JDK 默认加载 sun.net.www.protocol 包下的网络协议,JDK 默认已经实现了 jar、file、ftp、http、https 等。那如何扩展自定义协议呢?编程
package sun.net.www.protocol.classpath; import java.io.IOException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; /** * 自定义网络资源处理器,注意包名是 sun.net.www.protocol. + 协议名 */ public class Handler extends URLStreamHandler { private final static String PROTOCOL_PREFIX = "classpath:/"; @Override protected URLConnection openConnection(URL u) throws IOException { String urlString = u.toString(); urlString = urlString.substring(PROTOCOL_PREFIX.length()); ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); return classLoader.getResource(urlString).openConnection(); } }
测试:网络
@Test public void test3() throws Exception { URL url = new URL("classpath:/spring-context-01.xml"); URLConnection urlConnection = url.openConnection(); InputStream inputStream = urlConnection.getInputStream(); String content = IOUtils.toString(inputStream, Charset.forName("utf-8")); System.out.println(content); }
补充:JDK 中 classpath 问题并发
JDK 启动时 Launcher 建立了 Factory 对象,并将这个对象传递到了 ExtClassLoader 和 AppClassLoader 中。框架
public ExtClassLoader(File[] dirs) throws IOException { super(getExtURLs(dirs), null, factory); } AppClassLoader(URL[] urls, ClassLoader parent) { super(urls, parent, factory); }
因此能够经过 classpath 获取对应的资源文件, JDK 内部实际上经过 factory 获取对应的资源文件,通常是 jar 协议 ,如何证实这一点呢?咱们作个实验:异步
public void test() { URL fileUrl = getClass().getResource("/spring-context-01.xml"); URL jarUrl = getClass().getResource("/META-INF/license.txt"); // file:/F:/doc/java/code-2018/spring/target/classes/spring-context-01.xml System.out.println(fileUrl); // jar:file:/D:/Program_Files/Maven/LocalRepository/org/springframework/spring-core/5.1.0.RELEASE/spring-core-5.1.0.RELEASE.jar!/META-INF/license.txt System.out.println(jarUrl); }
Resource
ResourceLoader
ProtocolResolveride
本篇主要涉及到的是 java.util.concurrent 包中的 ExecutorService。ExecutorService 就是 Java 中对线程池的实现。
时代的局限性(JKD 9 以前)
阻塞编程:没法并行计算,资源低效使用
异步编程:Callback Future
数据方向:
Reactive Streams: 推模式(Push)
Iterator: 拉模式(Pull)
编程模式
Reactive Streams: 发布订阅模式(Publish-Subscriber)
Iterator: 命令式编程模式(Imperative)
onSubscribe() 订阅事件
onNext() 订阅事件
onComplete() 订阅事件
onError() 订阅事件
request() 订阅事件
cancel() 订阅事件
Mono 异步 0-1 元素序列,Futrue<Optional<?>>
Flux 异步 0-N 元素序列,Futrue<Collection<?>>
Reactive Stream 实现:
Java Green Thread
Java Native Thread
编程模型
Thread
Runable
缺乏线程管理的原生支持
缺乏执行完成的原生支持执行
结果获取困难
缺乏“锁”API
Double Check Locking不肯定性
JUC
编程模型
Executor
Runable Callable
Future
Fork/Join
编程模型
ForkJoinPool
ForkJoinTask
RecursiveActive
Future的限制没法手动完成
阻塞式结果返回
没法链式多个 Future
没法合并多个 Futures结果
缺乏异常处理
Fork/Join
编程模型
CompletionStage
CompletionFuture
参考:
天天用心记录一点点。内容也许不重要,但习惯很重要!