您好,欢迎访问三七文档
第10章Java的執行緒10-1執行緒的基礎10-2Java執行緒的使用方法10-3Java執行緒的同步10-4管道串流的執行緒10-1執行緒的基礎10-1-1Java的執行緒10-1-2多工與多執行緒10-1-1Java的執行緒-說明「執行緒」(Thread)也稱為「輕量行程」(LightweightProcess),其執行過程類似上述程式執行,只是執行緒不能單獨存在或執行,一定需要隸屬於一個程式,由程式啟動執行緒,如右圖所示:10-1-1Java的執行緒-多執行緒如果程式碼本身沒有先後依存關係,程式能夠分割成多個同步執行緒來一起執行,這種程式設計方法稱為「平行程式設計」(ParallelProgramming),如右圖所示:10-1-2多工與多執行緒目前的作業系統都強調「多工」(Multitasking)。例如:微軟的Windows作業系統屬於一套多工的作業系統,可以同時執行小畫家、記事本和小算盤等多個應用程式。不同於作業系統的多工,「多執行緒」(Multithreaded)是指在單一應用程式擁有多個執行流程。例如:Web瀏覽程式可以在下載網頁檔案的同時顯示動畫、播放音樂或捲動視窗瀏覽網頁內容。10-2Java執行緒的使用方法10-2-1實作Runnable介面10-2-2繼承Thread類別10-2Java執行緒的使用方法Java執行緒是建立Thread類別的物件,一共有2種方式建立多執行緒應用程式,如下所示:實作Runnable介面。繼承Thread類別。10-2-1實作Runnable介面-架構Swing應用程式繼承自JFrame,JavaApplet繼承自JApplet,就只能實作Runnable介面的run()方法來建立多執行緒的應用程式,如下所示:classUserThreadextendsUserClassimplementsRunnable{publicUserThread(intlength){}publicvoidrun(){………}}10-2-1實作Runnable介面-啟動接著可以建立Thread物件和啟動執行緒,如下所示:UserThreadut1=newUserThread(5);Threadt1=newThread(ut1,執行緒A);t1.start();上述程式碼在建立好UserThread物件ut1後,使用ut1物件建立Thread物件的執行緒,參數字串是執行緒名稱,最後使用start()方法啟動執行緒。10-2-1實作Runnable介面-建構子Thread類別的建構子,如下表所示:建構子說明Thread()Thread(String)Thread(Runnable)Thread(Runnable,String)建立Thread物件,參數String是執行緒名稱,Runnable是實作Runnable介面的物件10-2-1實作Runnable介面-相關方法Thread類別的相關方法,如下表所示:方法說明intactiveCount()類別方法可以取得目前共有多少個執行中的執行緒ThreadcurrentThread()類別方法可以取得目前的執行緒物件voidsleep(long)類別方法可以讓執行緒暫時停止執行一段時間,也就是參數long的毫秒數booleanisAlive()檢查目前執行緒是否在執行中,傳回值true為是,false為不是voidstart()啟動執行緒voidsetName(String)將執行緒指定為參數String字串的名稱StringgetName()取得執行緒的名稱字串StringtoString()取得執行緒名稱、優先權和群組名稱字串,預設的執行緒群組是main10-2-2繼承Thread類別-架構若類別沒有繼承其他類別,就可以直接繼承Thread類別,然後覆寫run()方法建立執行緒物件,如下所示:classUserThreadextendsThread{publicUserThread(intlength,Stringname){}publicvoidrun(){………}}10-2-2繼承Thread類別-啟動接著就可以建立Thread物件,啟動執行緒,如下所示:UserThreadut1=newUserThread(5,執行緒A);ut1.start();上述程式碼在建立好UserThread物件ut1後,這是Thread物件,所以可以直接使用start()方法啟動執行緒。10-3Java執行緒的同步-說明在第10-2節程式範例的執行緒間並沒有任何關係,簡單的說,執行緒的目的只是為了加速程式執行。另一種情況是執行緒間擁有生產和消費者的關係或是同時存取相同資源,當有此情況,就需要考量「同步」(Synchronization)問題。10-3Java執行緒的同步-生產者和消費者模型生產者和消費者模型(Producer/ConsumerModel)生產者和消費者模型是指一個執行緒產生資料,稱為生產者,另一個執行緒讀取生產者產生的資料,稱為消費者,產生的資料是儲存在共用的資料儲存緩衝區稱為「佇列」(Queue),這是一種先進先出的資料結構,如下圖所示:10-3Java執行緒的同步-synchronized關鍵字synchronized關鍵字生產者和消費者是同步存取同一個資源物件,所以存取的enqueue()和dequeue()方法需要使用synchronized關鍵字鎖定資源,稱為同步方法(SynchronizedMethod),如下所示:publicsynchronizedvoidenqueue(intvalue){……}publicsynchronizedintdequeue(){……}10-3Java執行緒的同步-wait()和notify()方法(說明)wait()和notify()方法同步執行緒雖然使用synchronized關鍵子避免同時存取相同物件,但是為了讓生產者產生的資料有地方儲存,且消費者能夠取得資料,有兩種情況需要特別處理,如下所示:佇列空了:如果佇列空了,消費者需要等待生產者產生資料。佇列滿了:如果佇列滿了,表示已經沒有地方儲存,生產者需要等待消費者讀取資料。10-3Java執行緒的同步-wait()和notify()方法(enqueue()方法)publicsynchronizedvoidenqueue(intvalue){try//如果佇列已滿{while(queue.isFull()){wait();//等待}}catch(InterruptedExceptione){}queue.enqueue(value);//存入notify();//通知dequeue()}10-3Java執行緒的同步-wait()和notify()方法(dequeue()方法)publicsynchronizedintdequeue(){try//如果佇列已空{while(queue.isEmpty()){wait();//等待}}catch(InterruptedExceptione){}intdata=queue.dequeue();//取出notify();//通知enqueue()returndata;}10-3Java執行緒的同步-wait()和notify()方法(相關方法)Object類別的相關方法,如下表所示:方法說明voidwait()voidwait(long)讓執行緒等待,直到notify()或notifyAll()方法喚醒,參數long表示不論是否被前面方法喚醒,在等待指定的毫秒數後也會被喚醒voidnotify()喚醒一個呼叫wait()方法的執行緒voidnotifyAll()喚醒所有呼叫wait()方法的執行緒10-4管道串流的執行緒JavaI/O套件的PipedInputStream和PipedOutputStream管道串流類別是InputStream和OutputStream的子類別,能夠建立類似第10-3節生產者和消費者模型的Java應用程式。PipedInputStream和PipedOutputStream管道串流類別能夠在一個執行緒產生資料寫入PipedOutputStream串流物件,然後在另一個執行緒從PipedInputStream串流物件讀取資料。
本文标题:Java的执行绪
链接地址:https://www.777doc.com/doc-840079 .html