版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 移動通信軟件編程基礎(chǔ) Java語言知識回顧I/O輸入 與輸出 基本文件操作字節(jié)流字符流File類使用流FileInputStream類和FileOutputStream類控制臺輸入流System.in過濾流緩沖流包裝流字節(jié)流和字符流的比較FileReader類與BufferedReader類FileWriter類與BufferedReader類11多線程第章本章目標(biāo)線程的基本概念Java中線程的實(shí)現(xiàn)方法線程的優(yōu)先級Java中同步的實(shí)現(xiàn) 死鎖及其解決方法進(jìn)程的基本概念 進(jìn)程1 存儲器 動態(tài)堆 靜態(tài)數(shù)據(jù) 程序代碼 存儲器 堆棧 進(jìn)程2 存儲器 動態(tài)堆 靜態(tài)數(shù)據(jù) 程序代碼 存儲器 堆棧 進(jìn)程間的關(guān)
2、系比較疏遠(yuǎn);各個進(jìn)程是在自己獨(dú)有的地址空間內(nèi)執(zhí)行。線程的基本概念 進(jìn)程 動態(tài)堆 靜態(tài)數(shù)據(jù) 程序代碼 寄存器 堆棧 寄存器 堆棧 存儲器線程1線程2線程的基本概念線程是進(jìn)行中的實(shí)體,一個進(jìn)程中可以包含一個或多個線程。一個線程在執(zhí)行期間同樣有一個開始,一個執(zhí)行序列和一個結(jié)束點(diǎn)。單個線程不是一個程序,并不能依靠自身單獨(dú)執(zhí)行,它必須在程序中執(zhí)行。基于線程的多任務(wù)處理環(huán)境中,線程是最小的處理單位。實(shí)現(xiàn)多任務(wù)需要多線程。線程的基本概念多線程:在Java中,一個應(yīng)用程序可以包含多個線程。每個線程執(zhí)行特定的任務(wù),并可與其他線程并發(fā)執(zhí)行。 多線程使系統(tǒng)的空轉(zhuǎn)時間減少,提高CPU利用率。多線程編程環(huán)境用方便的模型
3、隱藏CPU在任務(wù)間切換的事實(shí)。主線程public class MainThreadDemo public static void main(String args) /獲得主線程的一個引用 Thread t = Thread.currentThread(); /輸出線程信息 System.out.println(t); 運(yùn)行結(jié)果輸出默認(rèn)的線程信息Threadmain,5,mainThread類的常用方法方法說明void run()運(yùn)行一個線程void start()啟動線程并調(diào)用run方法static currentThread()返回當(dāng)前執(zhí)行的線程void join()等待線程終止final
4、 void setName(String name)改變線程的內(nèi)部名稱final String getName()返回線程的內(nèi)部名稱static void sleep(long millis)設(shè)置線程為休眠狀態(tài)Thread類常用方法的使用public class CreateThreadDemopublic static void main(String args)Thread T = Thread.currentThread();System.out.println(T);T.setName(ThreadNew);System.out.println(T);for(int i = 0; i1
5、0; i+)System.out.println(i);try T.sleep(1000);catch(InterruptedException ie) ie.printStackTrace(); 創(chuàng)建一個線程類class MyThread extends Thread public MyThread(String name)super(name); public void run() for(int i = 0; i10; i+) System.out.println(實(shí)現(xiàn)線程: + this); try sleep(1000); catch(InterruptedException ie)
6、 ie.printStackTrace(); public class CreateThreadDemo public static void main(String args) MyThread T = new MyThread(study); T.start(); 線程的狀態(tài)線程的狀態(tài):新生、就緒、運(yùn)行、睡眠、掛起、阻塞、死亡七種狀態(tài),線程從新生到死亡的狀態(tài)變化過程稱為生命周期 線程狀態(tài)的實(shí)現(xiàn)新建建立了一個線程對象線程處于新建狀態(tài)就緒在創(chuàng)建線程后,它將處于就緒狀態(tài)運(yùn)行線程在開始執(zhí)行時進(jìn)入運(yùn)行狀態(tài)睡眠線程的執(zhí)行可通過使用sleep()方法來暫時中止等待如果調(diào)用了wait()方法,線程將處于等
7、待狀態(tài)掛起suspend()方法使用線程處于掛起狀態(tài)恢復(fù)resume()方法可以使用掛起的線程阻塞在線程等待一個事件時(例如輸入/輸出操作),就稱其處于阻塞狀態(tài)死亡在run()方法已完成執(zhí)行或其stop()方法被調(diào)用之后,線程就處于死亡狀態(tài)線程狀態(tài)的實(shí)現(xiàn)class MyThread extends Thread public MyThread(String name)super(name); System.out.println(線程就緒); public void start()System.out.println(線程啟動);run(); public void run() System.
8、out.println(線程運(yùn)行);try System.out.println(線程將要休眠10秒); sleep(1000); System.out.println(線程休眠10秒繼續(xù)運(yùn)行);catch(InterruptedException ie) ie.printStackTrace(); public class CreateThreadDemo public static void main(String args) MyThread T = new MyThread(study); T.start(); System.out.println(線程死亡); 暫停線程的方法線程讓出
9、CPU時間片的方法:無法獲得CUP時間:線程優(yōu)先級比較低線程休眠:使用sleep()方法線程顯式出讓CUP控制權(quán):調(diào)用yield()方法線程等待:調(diào)用wait()方法阻塞:線程由于等待一個文件I/O事件線程優(yōu)先級class ChildThread extends Threadpublic void run()while(true)System.out.println(this + 子線程在運(yùn)行);yield();public class ThreadPriorityDemopublic static void main(String args)Thread MainT = Thread.cur
10、rentThread();ChildThread ChildT = new ChildThread();ChildT.setPriority(Thread.MAX_PRIORITY);ChildT.start();for(int i = 0; i 0) try Thread.sleep(5); catch(InterruptedException ie) ie.printStackTrace(); System.out.println(Thread.currentThread().getName() + 銷售票號為: + tickets- -); public class TicketsSal
11、epublic static void main(String args)ThreadSale T = new ThreadSale();Thread T1 = new Thread(T);Thread T2 = new Thread(T);Thread T3 = new Thread(T);Thread T4 = new Thread(T);T1.start();T2.start();T3.start();T4.start();使用Runnable接口實(shí)現(xiàn)多窗口售票線程同步程序中不能有多個線程同時在兩句代碼之間執(zhí)行,這就是線程同步。為了確保在任何時間點(diǎn)一個共享的資源只能被一個線程使用,就需要
12、使用“同步”。實(shí)現(xiàn)同步的方法有兩種:同步代碼塊同步方法同步代碼塊同步代碼塊模式如下所示,其中Object可以是任意的一個對象。 synchronized(object) /要同步的語句 使用此方法解決售票系統(tǒng)的問題 class ThreadSale implements Runnable private int tickets = 100; Object obj = new Object();/同步塊對象,任意對象均可 public void run() synchronized(obj) if(tickets 0) System.out.println(Thread.currentThrea
13、d().getName() + 銷售票號為: + tickets- -); 死鎖當(dāng)兩個線程循環(huán)依賴于一對同步對象時將發(fā)生死鎖死鎖是很難調(diào)試的錯誤死鎖的解決方法wait-notify機(jī)制是解決由于使用synchronized方法或塊產(chǎn)生的死鎖問題,實(shí)現(xiàn)線程間的通信。wait方法:線程對象在調(diào)用sleep( )后并不釋放對象的鎖,調(diào)用wait( )的時候會釋放對象的鎖。notify方法:喚醒同一對象監(jiān)視器中調(diào)用wait的第一個線程。被通知的線程重新獲得監(jiān)視器的鎖定繼續(xù)運(yùn)行。notifyAll方法:喚醒同一對象監(jiān)視器中調(diào)用wait的所有線程,具有最高優(yōu)先級的線程首先被喚醒并執(zhí)行。wait-notif
14、y機(jī)制示例class ThreadB extends Thread int total = 0; public void run() synchronized(this) for(int i = 0;i = 100; i+) total += i; System.out.println(計(jì)算完成.); notify(); public void synModify() public void synModify() synchronized(this) try System.out.println(在此等待直到計(jì)算完成.); wait(); System.out.println(返回繼續(xù)執(zhí)行!
15、); catch (InterruptedException e) e.printStackTrace(); System.out.println(顯示結(jié)果: + total); wait-notify機(jī)制示例 public class WaitNotifyDemo public static void main(String args) ThreadB b = new ThreadB();b.start(); b.synModify(); 生產(chǎn)者/消費(fèi)者問題 /生產(chǎn)者線程類class Producer extends Thread private CubbyHole cubbyhole; p
16、rivate int number; public Producer(CubbyHole c, int number) cubbyhole = c; this.number = number; public void run() public void run() for (int i = 0; i 10; i+) int temp = (int)(Math.random() * 1000); cubbyhole.put(temp); System.out.println(Producer # + this.number + put: + temp); try sleep(int)(Math.
17、random() * 1000); catch e.printStackTrace(); 生產(chǎn)者/消費(fèi)者問題 /消費(fèi)者線程類 class Consumer extends Thread private CubbyHole cubbyhole; private int number; public Consumer(CubbyHole c, int number) cubbyhole = c; this.number = number; public void run() int value = 0; for (int i = 0; i 10; i+) value = cubbyhole.get
18、(); System.out.println(Consumer # + this.number + get: + value); 生產(chǎn)者/消費(fèi)者問題 /共享數(shù)據(jù)類-模擬實(shí)現(xiàn)倉庫class CubbyHole private int seq; private boolean available = false; /取數(shù)據(jù)的同步方法get()-取得可消費(fèi)產(chǎn)品 public synchronized int get() /存放數(shù)據(jù)的同步方法put()-放置可消費(fèi)產(chǎn)品 public synchronized void put(int value) public synchronized int get() while( available=false ) try wait( ); /條件不符合,則wait catch( InterruptedException e ) e.printStackTrace(); available = false; /修改條件-取得產(chǎn)品后 notify();/通知喚醒其他等待的線程 return seq; /返回要取出的數(shù)值 pub
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025車輛保管合同書范文
- 2025保修工程合同范本
- 2025學(xué)校食堂承包合同書
- 2025關(guān)于試用期解除合同及案例
- 2025年度軍事電子對抗保密技術(shù)合同3篇
- 2025年度新能源充電設(shè)施建設(shè)公司合作協(xié)議書3篇
- 二零二五年度農(nóng)村房屋租賃合同(含農(nóng)業(yè)產(chǎn)業(yè)升級)
- 二零二五年度體育場館租賃合同及賽事運(yùn)營協(xié)議3篇
- 2025年度農(nóng)村個人地基使用權(quán)轉(zhuǎn)讓及農(nóng)業(yè)現(xiàn)代化設(shè)施配套協(xié)議書3篇
- 2025年度教育信息化項(xiàng)目經(jīng)理合作協(xié)議2篇
- 泰山產(chǎn)業(yè)領(lǐng)軍人才申報書
- 專題07:回憶性散文閱讀(考點(diǎn)串講)
- 公司IT運(yùn)維管理制度
- 護(hù)理帶教課件教學(xué)課件
- 促進(jìn)低空經(jīng)濟(jì)農(nóng)林生產(chǎn)應(yīng)用場景實(shí)施方案
- 重慶市市轄區(qū)(2024年-2025年小學(xué)四年級語文)人教版期末考試(上學(xué)期)試卷及答案
- 廣東省一年級數(shù)學(xué)上學(xué)期期末考試試卷部編版-(附解析)
- 2024年公安基礎(chǔ)知識考試題庫及答案
- 2024年北京通州區(qū)初三九年級上學(xué)期期末數(shù)學(xué)試題和答案
- 新蘇教版3三年級數(shù)學(xué)上冊(表格式)教案【全冊】
- 北師大版三年級數(shù)學(xué)上冊寒假作業(yè)96
評論
0/150
提交評論