线程销毁_多线程(2)-Java高级知识(9)
前面有一篇文章寫的是多線程的基本知識,以及線程實現的兩種方式,一種是繼承Thread類,另一種實現Runnable 接口,今天沿著前面的多線程,繼續分享多線程的第三種創建方法,以及第三種創建方法的優勢,前兩種方法的弊端。并且介紹一種新的線程同步機制:lock鎖的機制。
1. 實現線程的第三種方式:
實現 Callable 接口,重寫 call 方法.
圖1. 實現Callable接口實現多線程圖2. 調用以及啟動多線程2. 繼承Thread類,實現Runnable 接口實現多線程的弊端:
(1) 沒有返回值
(2) 不支持泛型
(3) 異常必須處理
3. Callable 強大在哪里呢?
(1) Future 接 口 位 于 java.util.concurrent 包 中 ,可 以 對 具 體Runnable、Callable 任務的執行結果進行取消(cancel 方法,嘗試取消執行此任務)、查詢是否完成(isDone 方法)、獲取結果(get 方法,等待完成,然后檢索其結果)等。
(2) FutrueTask 是 Futrue 接口的唯一的實現類.
(3) FutureTask 同時實現了 Runnable, Future 接口。它既可以作為 Runnable 被線程執行,又可以作為 Future 得到Callable 的返回值.
圖3. Future接口4. 線程同步的第三種方法:Lock鎖。
Lock 鎖:對需要上鎖的地方上鎖
1) JDK1.5 后新增的功能
2) 與 Synchronized 相比,Lock 可提供多種鎖方案,更靈活
3) Java.util.concurrent.locks 中的 Lock 是一個接口,它的實現類是一個 Java 類,而不是作為語言的特性(關鍵字)來實現。
注意:如果同步代碼有異常,要將 unLock()放到 finally 中。
4. 1 創建Lock鎖的步驟。
(1) 創建 Lock 對象
(2) 調用 lock()方法上鎖
(3) 調用 unlock()方法解鎖
4.2 Lock 與 synchronized 的區別。
(1) Lock 是 顯 示 鎖 (手 動 開 啟 和 關 閉 鎖 ,別 忘 關 閉鎖),synchronized 是隱式鎖
(2) Lock 只有代碼塊鎖,synchronized 有代碼塊鎖和方法鎖。
(3) 使用 Lock 鎖,JVM 將花費較少的時間來調度線程,性能更好,并且具有更好的擴展性(提供更多的子類)。
(4) Lock 確保當一個線程位于代碼的臨界區時,另一個線程不進入臨界區。如果其他線程試圖進入鎖定的代碼,則它將一直等待(即被阻止),直到該對象被釋放。lock()方法會對 Lock 實例對象進行加鎖,因此所有對該對象調用 lock()方法的線程都會被阻塞,直到該 Lock 對象的 unlock()方法被調用。
5. 線程池。
5.1 什么是線程池?
創建和銷毀對象是非常耗費時間的
創建對象:需要分配內存等資源
銷毀對象 :雖然不需要程序員操心,但是垃圾回收器會在后臺一直跟蹤并銷毀對于經常創建和銷毀、使用量特別大的資源,比如并發情況下的線程,對性能影響很大。
思路 :創建好多個線程,放入線程池中,使用時直接獲取引用,不使用時放回池中??梢员苊忸l繁創建銷毀、實現重復利用。
5.2 線程池的好處.
(1) 提高響應速度(減少了創建新線程的時間)
(2) 降低資源消耗(重復利用線程池中線程,不需要每次都創建)
(3) 提高線程的可管理性:避免線程無限制創建、從而銷毀系
統資源,降低系統穩定性,甚至內存溢出或者 CPU 耗盡
5.3 線程池的應用場合
(1) 需要大量線程,并且完成任務的時間短。
(2) 對性能要求苛刻。
(3) 接受突發性的大量請求。
6. 任務調度 度 Task_Timer和 ThreadLocal。
6.1 什么是調度?
任務:就是事情
調度:在不同的時間點或者在指定的時間點或者間隔多長時間我去運行這個任務。
類似于生活中的鬧鐘。
6.2 ThreadLocal.
ThreadLocal 直譯為“本地線程”,其實它就是一容器,用于存放線程的局部變量
作用:為解決多線程程序的并發問題。
圖4. ThreadLocal 的 的 API謝謝大家,共同努力,共同進步。
總結
以上是生活随笔為你收集整理的线程销毁_多线程(2)-Java高级知识(9)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JDBC预状态通道设置时间格式的问题
- 下一篇: HTML中form和div出现间隙以及页