計(jì)算機(jī)軟件及應(yīng)用移動通信軟件編程基礎(chǔ)—JAVA語言.pptx_第1頁
計(jì)算機(jī)軟件及應(yīng)用移動通信軟件編程基礎(chǔ)—JAVA語言.pptx_第2頁
計(jì)算機(jī)軟件及應(yīng)用移動通信軟件編程基礎(chǔ)—JAVA語言.pptx_第3頁
計(jì)算機(jī)軟件及應(yīng)用移動通信軟件編程基礎(chǔ)—JAVA語言.pptx_第4頁
計(jì)算機(jī)軟件及應(yīng)用移動通信軟件編程基礎(chǔ)—JAVA語言.pptx_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論