1. 程式人生 > >-1-5 java 多執行緒 概念 程序 執行緒區別聯絡 java建立執行緒方式 執行緒組 執行緒池概念 執行緒安全 同步 同步程式碼塊 Lock鎖 sleep()和wait()方法的區別 為什麼wait(),notify(),notifyAll()等方法都定義在O

-1-5 java 多執行緒 概念 程序 執行緒區別聯絡 java建立執行緒方式 執行緒組 執行緒池概念 執行緒安全 同步 同步程式碼塊 Lock鎖 sleep()和wait()方法的區別 為什麼wait(),notify(),notifyAll()等方法都定義在O

 本文關鍵詞: java 多執行緒 概念 程序 執行緒區別聯絡 java建立執行緒方式 執行緒組 執行緒池概念 執行緒安全 同步 同步程式碼塊 Lock鎖  sleep()和wait()方法的區別 為什麼wait(),notify(),notifyAll()等方法都定義在Object類中

多執行緒

•程序: •正在執行的程式,是系統進行資源分配和呼叫的獨立單位。 •每一個程序都有它自己的記憶體空間和系統資源。 •執行緒: •是程序中的單個順序控制流,是一條執行路徑 •一個程序如果只有一條執行路徑,則稱為單執行緒程式。 •一個程序如果有多條執行路徑,則稱為多執行緒程式。                 多程序的意義?
                        提高CPU的使用率                 多執行緒的意義?                         提高應用程式的使用率

Java程式執行原理

•java命令會啟動 java 虛擬機器,啟動 JVM,等於啟動了一個應用程式,也就是啟動了一個程序。 該程序會自動啟動一個 “主執行緒” ,然後主執行緒去呼叫某個類的 main方法。 所以 main方法執行在主執行緒中。在此之前的所有程式都是單執行緒的。 java中對於執行緒的描述是Thread  其中封裝了執行緒的資訊,最重要的還有需要執行的任務的資訊
Thread類名的基本獲取和設定方法 •public final String getName() •public final void setName(String name) •其實通過構造方法也可以給執行緒起名字

建立執行緒方式一

繼承Thread類

1.子類覆蓋父類中的run方法,將執行緒執行的程式碼存放在run中。 2.建立子類物件的同時執行緒也被建立。 3.通過呼叫start方法開啟執行緒。

建立執行緒方式二

實現Runnable介面

1.子類覆蓋介面中的run方法。 2.通過Thread類建立執行緒,並將實現了Runnable介面的子類物件作為引數傳遞給Thread類的建構函式。
3.Thread類物件呼叫start方法開啟執行緒。
啟動一個執行緒是run()還是start()?它們的區別?         start();         run():封裝了被執行緒執行的程式碼,直接呼叫僅僅是普通方法的呼叫         start():啟動執行緒,並由JVM自動呼叫run()方法

執行緒的排程和優先順序

        執行緒的排程                 分時排程                 搶佔式排程 (Java採用的是該排程方式)         獲取和設定執行緒優先順序                 預設是5                 範圍是1-10

執行緒的控制方法

•執行緒休眠 •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() 停止執行緒還可以通過定義迴圈控制標誌來解決現成的停止問題

sleep()和wait()方法的區別

        sleep():必須指時間;不釋放鎖。         wait():可以不指定時間,也可以指定時間;釋放鎖。 為什麼wait(),notify(),notifyAll()等方法都定義在Object類中         因為這些方法的呼叫是依賴於鎖物件的,而同步程式碼塊的鎖物件是任意鎖。         而Object程式碼任意的物件,所以,定義在這裡面。 多執行緒同時請求共享資源,並且操作的程式碼不是原子操作的時候 就會出現多執行緒的安全問題

解決執行緒安全問題的基本思想

首先想為什麼出現問題?(也是我們判斷是否有問題的標準) •是否是多執行緒環境 •是否有共享資料 •是否有多條語句操作共享資料 如何解決多執行緒安全問題呢? •基本思想:讓程式沒有安全問題的環境。 •怎麼實現呢? •把多個語句操作共享資料的程式碼給鎖起來,讓任意時刻只能有一個執行緒執行即可。

 同步

同步程式碼塊 •格式:

 synchronized(物件){需要同步的程式碼;}

•同步可以解決安全問題的根本原因就在那個物件上。該物件如同鎖的功能。 同步方法 •就是把同步關鍵字加到方法上 同步方法的鎖物件是this 靜態同步方法所物件是類名.class 物件 Lock
Lock •void lock() •void unlock() ReentrantLock

執行緒組

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

執行緒池

程式啟動一個新執行緒成本是比較高的,因為它涉及到要與作業系統進行互動。 而使用執行緒池可以很好的提高效能 尤其是當程式中要建立大量生存期很短的執行緒時,更應該考慮使用執行緒池。 •執行緒池裡的每一個執行緒程式碼結束後,並不會死亡,而是再次回到執行緒池中成為空閒狀態,等待下一個物件來使用。 •在JDK5之前,我們必須手動實現自己的執行緒池,從JDK5開始,Java內建支援執行緒池 JDK5新增了一個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) 實現Callable介面  也可以實現多執行緒

匿名內部類方式使用多執行緒

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編寫的開源排程框架。

執行緒類的其他方法

setPriority(int num) setDaemon(boolean b) join() 自定義執行緒名稱 toString()