何爲進程?
資源分配的最小單元,(資源包括:表格,內存空間,磁盤空間)同一進程中的多條線程講共享該進程中的資源何爲線程
CPU調度的最小單元,線程只有相關堆棧中的寄存器和線程控制表組成,而寄存器可被用來存儲線程內的局部變量線程安全是指什麼?
只有單例模式下共享全局變量纔會導致線程不安全問題鎖
分爲隱式鎖和顯示鎖;Synchronized是隱式鎖,加在對象上的。顯示鎖:lock,需要手動開關,使用靈活Concurrent包
1)原子性操作類,不需要Synchronized關鍵字,線程安全效率高
2)線程隊列,Java提供了一些線程安全的隊列操作的類
3)線程閥,控制線程的開始和結束線程池
1、解決頻繁創建線程所產生的開銷,減少創建和銷燬線程所花的時間和資源消耗
2、解決無限制的創建線程所引起的系統崩潰
3、Executors提供了4種創建線程池的方法
ExcutorService pool = Excutors.newFixedThreadPool(5);//創建一個可重用固定線程數的線程池
#單任務線程池
ExcutorService pool = Excutors.newSingleThreadExcutor();
#可變尺寸的線程池
ExcutorService pool = Excutors.newCachedThreadExcutor();
#定時以及週期性執行任務的線程池
ScheduledThreadPoolExecutor exec = Executors.ScheduledThreadPoolExecutor(1);
exec.scheduleAtFixedRate(new Runnable() {
publicvoid run() {
.....////每隔一段時間就觸發的線程內容
}
}, 1000, 5000,TimeUnit.MILLISECONDS);
線程池的理解(摘自網絡)
這裏要重點解釋一下corePoolSize、maximumPoolSize、largestPoolSize三個變量。
corePoolSize在很多地方被翻譯成核心池大小,其實我的理解這個就是線程池的大小。舉個簡單的例子:
假如有一個工廠,工廠裏面有10個工人,每個工人同時只能做一件任務。
因此只要當10個工人中有工人是空閒的,來了任務就分配給空閒的工人做;
當10個工人都有任務在做時,如果還來了任務,就把任務進行排隊等待;
如果說新任務數目增長的速度遠遠大於工人做任務的速度,那麼此時工廠主管可能會想補救措施,比如重新招4個臨時工人進來;
然後就將任務也分配給這4個臨時工人做;
如果說着14個工人做任務的速度還是不夠,此時工廠主管可能就要考慮不再接收新的任務或者拋棄前面的一些任務了。
當這14個工人當中有人空閒時,而新任務增長的速度又比較緩慢,工廠主管可能就考慮辭掉4個臨時工了,只保持原來的10個工人,畢竟請額外的工人是要花錢的。
這個例子中的corePoolSize就是10,而maximumPoolSize就是14(10+4)。
也就是說corePoolSize就是線程池大小,maximumPoolSize在我看來是線程池的一種補救措施,即任務量突然過大時的一種補救措施。
不過爲了方便理解,在本文後面還是將corePoolSize翻譯成核心池大小。
largestPoolSize只是一個用來起記錄作用的變量,用來記錄線程池中曾經有過的最大線程數目,跟線程池的容量沒有任何關係。應用場景
Servlet 我們java開發最基本的東西,其啓動的時候其實是開闢了一個main線程的。而其中servlet類是單例的所以它是線程不安全的,但是在沒有共享全局變量的情況,而reqest和response是一個請求是一個實例,而其本身的數據設計又是線程安全的。Tomcat Servlet的容器tomcat其實是對線程的線程池做了控制的。提高請求處理效率和避免請求太多把容器弄掛。
Spring 默認加載bean的方式是單例的,所以其是線程不安全的。
數據庫連接池,其實也是多線程。
nginx 前端網關請求,也是利用了線程池的原理。
而我們的客戶端ios,android其實也都是有主線程和子線程的說法,如果你能很好的將器裏面的線程掌握基本上此種客戶端開發就能掌握一半。