java 之 API-多線程

這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

多線程概述

多線程概述
進程:
    正在運行的程序,是系統進行資源分配和調用的獨立單位。
    每一個進程都有它自己的內存空間和系統資源。
線程:
    是進程中的單個順序控制流,是一條執行路徑
    一個進程如果只有一條執行路徑,則稱爲單線程程序。
    一個進程如果有多條執行路徑,則稱爲多線程程序。

java程序運行原理

Java程序運行原理
java 命令會啓動 java 虛擬機,啓動 JVM,等於啓動了一個應用程序,也就是啓動了一個進程。該進程會自動啓動一個 “主線程” ,然後主線程去調用某個類的 main 方法。所以 main方法運行在主線程中。在此之前的所有程序都是單線程的。

如何獲取和設置線程名稱

Thread類的基本獲取和設置方法
    public final String getName()
    public final void setName(String name)
    其實通過構造方法也可以給線程起名字

線程調度

    假如我們的計算機只有一個 CPU,那麼 CPU 在某一個時刻只能執行一條指令,線程只有得到 CPU時間片,也就是使用權,纔可以執行指令。那麼Java是如何對線程進行調用的呢?

線程有兩種調度模型:
    分時調度模型   所有線程輪流使用 CPU 的使用權,平均分配每個線程佔用 CPU 的時間片
    搶佔式調度模型   優先讓優先級高的線程使用 CPU,如果線程的優先級相同,那麼會隨機選擇一個,優先級高的線程獲取的 CPU 時間片相對多一些。 
    Java使用的是搶佔式調度模型。
    演示如何設置和獲取線程優先級
    public final int getPriority()
    public final void setPriority(int newPriority)

線程控制

我們已經知道了線程的調度,接下來我們就可以使用如下方法對象線程進行控制
線程休眠
    public static void sleep(long millis)
線程加入
    public final void join()
線程禮讓
    public static void yield()
後臺線程
    public final void setDaemon(boolean on)
中斷線程
    public final void stop()
    public void interrupt()

這裏寫圖片描述

多線程的實現方案2

實現Runnable接口
    如何獲取線程名稱
    如何給線程設置名稱
實現接口方式的好處
    可以避免由於Java單繼承帶來的侷限性。
    適合多個相同程序的代碼去處理同一個資源的情況,把線程同程序的代碼,數據有效分離,較好的體現了面向對象的設計思想。

同步的特點

同步的前提
    多個線程
        多個線程使用的是同一個鎖對象
    同步的好處
        同步的出現解決了多線程的安全問題。
    同步的弊端
        當線程相當多時,因爲每個線程都會去判斷同步上的鎖,這是很耗費資源的,無形中會降低程序的運行效率。

JDK5中Lock鎖的使用

    雖然我們可以理解同步代碼塊和同步方法的鎖對象問題,但是我們並沒有直接看到在哪裏加上了鎖,在哪裏釋放了鎖,爲了更清晰的表達如何加鎖和釋放鎖,JDK5以後提供了一個新的鎖對象Lock
Lock
    void lock()
    void unlock()
ReentrantLock

死鎖問題

同步弊端
    效率低
    如果出現了同步嵌套,就容易產生死鎖問題
    死鎖問題
    是指兩個或者兩個以上的線程在執行的過程中,因爭奪資源產生的一種互相等待現象

線程間通信

針對同一個資源的操作有不同種類的線程
舉例:賣票有進的,也有出的。

通過設置線程(生產者)和獲取線程(消費者)針對同一個學生對象進行操作

這裏寫圖片描述

線程組

Java中使用ThreadGroup來表示線程組,它可以對一批線程進行分類管理,Java允許程序直接對線程組進行控制。
默認情況下,所有的線程都屬於主線程組。
    public final ThreadGroup getThreadGroup()
我們也可以給線程設置分組
    Thread(ThreadGroup group, Runnable target, String name)

線程池

    程序啓動一個新線程成本是比較高的,因爲它涉及到要與操作系統進行交互。而使用線程池可以很好的提高性能,尤其是當程序中要創建大量生存期很短的線程時,更應該考慮使用線程池。
    線程池裏的每一個線程代碼結束後,並不會死亡,而是再次回到線程池中成爲空閒狀態,等待下一個對象來使用。
    在JDK5之前,我們必須手動實現自己的線程池,從JDK5開始,Java內置支持線程池

DK5新增了一個Executors工廠類來產生線程池,有如下幾個方法
    public static ExecutorService newCachedThreadPool()
    public static ExecutorService newFixedThreadPool(int nThreads)
    public static ExecutorService newSingleThreadExecutor()
    這些方法的返回值是ExecutorService對象,該對象表示一個線程池,可以執行Runnable對象或者Callable對象代表的線程。它提供瞭如下方法
Future<?> submit(Runnable task)
<T> Future<T> submit(Callable<T> task)

匿名內部類方式使用多線程

匿名內部類方式使用多線程
new Thread(){代碼…}.start();
New Thread(new Runnable(){代碼…}).start();

定時器

定時器是一個應用十分廣泛的線程工具,可用於調度多個定時任務以後臺線程的方式執行。在Java中,可以通過Timer和TimerTask類來實現定義調度的功能
    Timer
    public Timer()
    public void schedule(TimerTask task, long delay)
    public void schedule(TimerTask task,long delay,long period)
TimerTask
    public abstract void run()
    public boolean cancel()
開發中
    Quartz是一個完全由java編寫的開源調度框架。

設計模式

設計模式概述
    什麼是設計模式
設計模式分類
    創建型模式
    行爲型模式
    結構型模式

單例設計模式

單例設計思想
    保證類在內存中只有一個對象
如何實現類在內存中只有一個對象呢?
    構造私有
    本身提供一個對象
    通過公共的方法讓外界訪問

Runtime類的概述和使用

Runtime類概述
    每個 Java 應用程序都有一個 Runtime 類實例,使應用程序能夠與其運行的環境相連接。可以通過 getRuntime 方法獲取當前運行時。 
    應用程序不能創建自己的 Runtime 類實例。 
Runtime類使用
    public Process  exec(String command)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章