java多线程 ppt,java多线程ppt课件
JAVA多線程 線程的基本概念 線程的創建和啟動 線程的調度和優先級 線程的狀態控制 線程同步 JAVA SE基礎 線程的基本概念 ?線程是一個程序內部的順序控制流。 ?線程和進程的區別 ? 每個進程都有獨立的代碼和數據空間(進程上下文),進程間的切換 會有較大的開銷。 ? 線程可以看成時輕量級的進程,同一類線程共享代碼和數據空間, 每個線程有獨立的運行棧和程序計數器(PC),線程切換的開銷小。 ? 多進程: 在操作系統中能同時運行多個任務(程序) ? 多線程: 在同一應用程序中有多個順序流同時執行 nJava的線程是通過java.lang.Thread類來實現的。 n VM 啟動時會有一個由主方法(public static void main() {})所 定義的線程。 n 可以通過創建 Thread 的實例來創建新的線程。 n 每個線程都是通過某個特定Thread對象所對應的方法run( )來完成 其操作的,方法run( )稱為線程體。 n 通過調用Thead類的start()方法來啟動一個線程。 線程的創建和啟動 ?可以有兩種方式創建新的線程。 – 第一種 ? 定義線程類實現Runnable接口 ? Thread myThread = new Thead(target)//target為 Runnable接口類型。 ? Runnable中只有一個方法: – public void run(); 用以定義線程運行體。 ? 使用Runnable接口可以為多個線程提供共享的數據。 ? 在實現Runnable接口的類的run方法定義中可以使用Thread的靜 態方法: – public static Thread currentThread() 獲取當前線程的引 用。 – 第二種 ? 可以定義一個Thread的子類并重寫其run方法如: class MyThread extends Thead { public void run(){…} } ? 然后生成該類的對象: MyThread myThread=new MyThead(…) ?使用那種好呢? 線程狀態轉換 方 法功 能 isAlive()判斷線程是否還“活”著,即線程是否還未終止。 getPriority()獲得線程的優先級數值 setPriority()設置線程的優先級數值 Thread.sleep()將當前線程睡眠指定毫秒數 join() 調用某線程的該方法,將當前線程與該線程“合并”,即等待 該線程結束,再恢復當前線程的運行。 yield()讓出CPU,當前線程進入就緒隊列等待調度。 wait()當前線程進入對象的wait pool。 notify()/ notifyAll() 喚醒對象的wait pool中的一個/所有等待線程。 線程狀態轉換 sleep / join / yield 方法 ? sleep方法 – 可以調用Thread的靜態方法: public static void sleep(long millis) throws InterruptedException 使得當前線程休眠(暫時停止執行millis毫秒)。 – 由于是靜態方法,sleep可以由類名直接調用: Thread.sleep(…) ? join方法 – 合并某個線程 ? yield方法 – 讓出CPU,給其他線程執行的機會 線程模式 § 兩種線程模式: § 協作式:一個線程保留對處理器的控制直到它自己決定 放棄 § 速度快、代價低 § 用戶編程非常麻煩 § 搶先式。系統可以任意的從線程中奪回對CPU的控制 權,再把控制權分給其它的線程 。 § 兩次切換之間的時間間隔就叫做時間片 § 效率不如協作式高 ,OS核心必須負責管理線程 § 簡化編程,而且使程序更加可靠 § 多數線程的調度是搶先式的。 線程的優先級別 ? Java提供一個線程調度器來監控程序中啟動后進入就緒狀態的所有 線程。線程調度器按照線程的優先級決定應調度哪個線程來執行。 ? 線程的優先級用數字表示,范圍從1到10,一個線程的缺省優先級 是5。 –Thread.MIN_PRIORITY = 1 –Thread.MAX_PRIORITY = 10 –Thread.NORM_PRIORITY = 5 ? 使用下述線方法獲得或設置線程對象的優先級。 –int getPriority(); –void setPriority(int newPriority); ?不同平臺上的優先級 – Solaris:相同優先級的線程不能相互搶占對方的cpu時間。 – windows:可以搶占相同甚至更高優先級的線程的cpu時間 臨界資源問題(1) ? 兩個線程A和B在同時操縱Stack類的同一個實例(堆棧),A 正在往堆棧里push一個數據,B則要從堆棧中pop一個數 據。 class Stack{ int idx=0; char[ ] data = new char[6]; public void push(char c){ data[idx] = c; idx++; } public char pop(){ idx--; return data[idx]; } } 臨界資源問題(2) 1. 操作之前 data = | a | b | | | | | idx=2 2. A執行push中的第一個語句,將c推入堆棧; data = | a | b | c | | | | idx=2 3. A還未執行idx++語句,A的執行被B中斷,B執行pop方 法,返回c: data = | a | b | c | | | | idx=1 4. A繼續執行push的第二個語句: data = | a | b | c | | | | idx=2 最后的結果相當于c沒有入棧,產生這種問題的原因在于 對共享數據訪問的操作的不完整性。 線程同步 public class Test implements Runnable { Timer timer = new Timer(); public static void main(String[] args) { Test test = new Test(); Thread t1 = new Thread(test); Thread t2 = new Thread(test); t1.setName(“t1“); t2.setName(“t2“); t1.start(); t2.start(); } public void run(){ timer.add(Thread.currentThread().getName()); } } class Timer{ private static int num = 0; public void add(String name){ num ++; try {Thread.sleep(1);} catch (InterruptedException e) {} System.out.println(name+“, 你是第“+num+“個使用timer的線程“); } } Synchronized總結 ?無論synchronized關鍵字加在方法上還是對象上,它取得的鎖都是鎖在了對 象上,而不是把一段代碼或函數當作鎖――而且同步方法很可能還會被其他線 程的對象訪問。 ?每個對象只有一個鎖(lock)與之相關聯。 ?實現同步是要很大的系統開銷作為代價的,甚至可能造成死鎖,所以盡量避 免無謂的同步控制。 ?搞清楚synchronized鎖定的是哪個對象,就能幫助我們設計更安全的多線程 程序。 ?還有一些技巧可以讓我們對共享資源的同步訪問更加安全: – 定義private 的instance變量+它的 get方法,而不要定義 public/protected的instance變量。如果將變量定義為public,對象在外 界可以繞過同步方法的控制而直接取得它,并改動它。 – 如果instance變量是一個對象,如數組或ArrayList什么的,那上述方法 仍然不安全,因為當外界對象通過get方法拿到這個instance對象的引用 后,又將其指向另一個對象,那么這個private變量也就變了,豈不是很 危險。 這個時候就需要將get方法也加上synchronized同步,并且,只 返回這個private對象的clone()――這樣,調用端得到的就是對象副本的引 用了。 線程同步 ? 在Java語言中,引入了對象互斥鎖的概念,保證共享數據操作的完整性。每 個對象都對應于一個可稱為“互斥鎖”的標記,這個標記保證在任一時刻, 只能有一個線程訪問該對象。 ? 關鍵字synchronized 來與對象的互斥鎖聯系。當某個對象synchronized修 飾時,表明該對象在任一時刻只能由一個線程訪問。 … … … synchronized(this){ num ++; try {Thread.sleep(1);} catch (InterruptedException e) {} System.out.println (name+“, 你是第“+num+“個使用timer的線程“); } … … … ? synchronized 的使用方法: ? synchronized 還可以放在方法聲明中,表示整個方法為同步方法,例如: synchronized public void add(String name){…} 面試:Wait sleep區別 ? 來源不同 – Sleep是Thread提供的方法 – Wait繼承自Object ? 代碼位置不同 – Wait需要寫在Synchronize語句塊里面 ? 是否釋放鎖定對象 – 調用wait方法,釋放鎖定該對象 – Sleep時別的線程也不可以訪問鎖定對象 總結 ? 線程、進程的概念 ? 線程的創建和啟動方式 ? 線程的調度和優先級 ? Sleep ? Join ? Yield ? synchronized ? Wait ? Notify、notifyAll Q&A Any Question? www.Coredu.cn 謝謝大家
展開閱讀全文
總結
以上是生活随笔為你收集整理的java多线程 ppt,java多线程ppt课件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 尝试用单片机以及GSM模块做出一个简易手
- 下一篇: android播放器可点击列表,Andr