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
參考:
天天用心記錄一點點。內容也許不重要,但習慣很重要!