在實際開發過程中遇到的多線程情況不多,但是在生產環境中多線程是最基本的情況,java面試時也會考到,所以看看多線程的知識還是很有必要的。
Thread,Runnable,Callable,Future,FutureTask,Executors這是java常見的接口和類。
thread.run():線程具體要執行的代碼,thread.join():等待該線程完成。
---------------------8/25
寫過一些程序后,在來看多線程。其實多線程涉及到內存讀寫,cpu等底層的東西,java語言也盡量幫我們封裝和抽象,使其對于程序員能夠簡單些。其中java中有synchronized和volatile關鍵字,以及后面的Excutor框架。
synchronized:給對象(或者代碼塊)加鎖,使一個線程在訪問時,其他線程等待,實現機制:jvm內置的鎖
volatile:在多線程中保證線程的可見性,具體機制主要是保證內存和緩存中的數據的一致性。
問題:
1.多個用戶訪問同一段代碼算多線程嗎? 答:不一定
2.通常說的并發是不是針對多線程的?答:是
3.那怎么樣控制并發?答:鎖
java的并發操作中,主要在java.util.concurrent包中。
比如常見的ScheduledExecutorService,簡單來說,這是一個執行定時任務的線程,可以參考這篇博文:https://blog.csdn.net/wangmx1993328/article/details/80840598,這個類適合于在分布式系統中定時發送心跳的操作。同時還有個簡單的Timer和TimerTask類:https://blog.csdn.net/wangmx1993328/article/details/80785614,都是非常好的閱讀材料。其用法簡單一句話總結:timer.schedule(timeTask,0,60*1000)。
其中ConcurrentLinkedQueue的源碼解讀,這篇博文寫的非常不錯
-----------------8/13
數據庫連接池就使用了多線程的技術,數據庫連接池基本是標配了,如c3p0,dbcp等,這已經成為比較成熟的技術,我之前也用過c3p0,現在有些忘了,我需要理解一下。應該看一下源碼,能看懂一點是一點。
new ComboPooledDataSource();//空參,自動到classpath目錄下面加載“c3p0-config.xml”配置文件---配置文件的存儲位置和名稱必須是這樣,且使用“默認配置”
//ComboPooledDataSource pool = new ComboPooledDataSource("demo");//加載“c3p0-config.xml”文件中定義的“demo”這個配置元素
-------8/23-------
我發現我對java多線程的認識還存在很大的誤區。比如多線程的停止和程序的停止,調用一個函數,雖然看起來沒有開啟一個線程,其實很可能已經開啟了。
開發框架比如Netty,大量使用異步回調ChannelFuture,自己實現異步回調比較苦難,但是JDK8提供了異步調用的類CompletableFuture,非常友好。
參考資料:《java并發編程的藝術》