Java語言程序設計(自考)課件 第9、10章 SWING組件、多線程_第1頁
Java語言程序設計(自考)課件 第9、10章 SWING組件、多線程_第2頁
Java語言程序設計(自考)課件 第9、10章 SWING組件、多線程_第3頁
Java語言程序設計(自考)課件 第9、10章 SWING組件、多線程_第4頁
Java語言程序設計(自考)課件 第9、10章 SWING組件、多線程_第5頁
已閱讀5頁,還剩112頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第九章Swing組件

學習目標能夠正確創建組合框和列表,響應組合框和列表事件能夠正確創建文本域和文本區,處理文本事件,利用文本組件實現數據的輸入和輸出能夠在窗口中設置菜單,處理菜單項事件能夠正確聲明和創建對話框本章內容組合框與列表1文本組件2菜單組件3對話框4第一節組合框與列表組合框(JComboBox)是一個下拉式菜單,它有兩種形式:不可編輯的和可編輯的對不可編輯的JComboBox,用戶只能在現有的選項列表中進行選擇對可編輯的JComboBox,用戶既可以在現有選項中選擇,也可以輸入新的內容

JComboBox構造方法

JComboBox()創建一個沒有任何可選項的默認組合框JComboBox(Object[]items)根據Object數組創建組合框,Object數組的元素即為組合框中的可選項下面命令將創建一個具有5個可選項的組合框:String[]itemList={"One","Two","Three","Four","Five"};JComboBox

jcb=newJComboBox(itemList); //使用數組itemList創建組合框JComboBox類中方法

voidaddItem(ObjectanObject)在末尾位置添加新的可選項ObjectgetItemAt(intindex)返回指定索引序號index處的可選項intgetItemCount()返回列表中的項數voidinsertItemAt(ObjectanObject,intindex)在index指定的位置添加新的可選項anObjectJComboBox類中方法

intgetSelectedIndex()返回列表中與給定項匹配的第一個選項的索引序號ObjectgetSelectedItem()返回當前所選項voidremoveAllItems()刪除所有可選項voidremoveItem(ObjectanObject)刪除由anObject指定的可選項voidremoveItemAt(intanIndex)刪除由anIndex指定處的可選項示例

程序9-1每當用戶在組合框jcb1中進行選擇,被選中的選項就會通過下面命令被插入到組合框jcb2中的第一個位置:jcb2.insertItemAt(jcb1.getSelectedItem(),0);getSelectedItem()方法可獲得用戶的當前選項選項的索引序號是從0開始的

列表列表(JList)是可供用戶進行選擇的一系列可選項構造方法JList()構造一個空列表JList(Object[]listData)構造一個列表,列表的可選項由對象數組listData指定JList(Vector<?>listData)構造一個列表,使其顯示指定Vector中的元素示例

下面的語句根據String數組構造一個包含4個可選項的列表:String[]data={"one","two","three","four"};JListdataList=newJList(data);

當用戶在列表上進行選擇時,將引發ListSelectionEvent事件在JList中提供了addListSelectionListener(ListSelectionListenerlistener)方法,用于注冊對應的事件偵聽程序在ListSelectionListener接口中,只包含一個方法:publicvoidvalueChanged(ListSelectionEvente);當列表的當前選項發生變化時,將會調用該方法JList類中的方法publicintgetSelectedIndex()返回所選項第一次出現的索引;如果沒有所選項,則返回-1publicObjectgetSelectedValue()返回所選的第一個值,如果選擇為空,則返回nullpublicvoidsetVisibleRowCount(intvisibleRowCount)設置不使用滾動條可以在列表中顯示的首選行數示例程序9.2當程序運行時,在文本域中輸入字符串,并單擊按鈕,可以動態地為列表添加可選項在列表對象創建之后,也可以使用JList中定義的setModel(ListModelmodel)方法設置新的ListModel。列表對象本身并不帶滾動條,但是當列表可選項較多時,可以將列表對象放入JScrollPane中以提供滾動功能列表既支持單項選擇也支持多項選擇setSelectionMode(intselectionMode)方法中參數selectionMode可以是下列常量:ListSelectionModel.SINGLE_SELECTION只能進行單項選擇ListSelectionModel.SINGLE_INTERVAL_SELECTION可多項選擇,但多個選項必須是連續的ListSelectionModel.MULTIPLE_INTERVAL_SELECTION多項選擇,多個選項可以是間斷的,這是選擇模式的默認值第二節文本組件文本組件可用于顯示信息和提供用戶輸入功能在Swing中提供了文本域(JTextField)、口令輸入域(JPasswordField)、文本區(JTextArea)等多個文本組件這些文本組件都有一個共同的父類——JTextComponentJTextComponent中定義的方法StringgetSelectedText()從文本組件中提取被選中的文本內容String getText()從文本組件中提取所有文本內容StringgetText(intoffs,intlen)從文本組件中提取指定范圍的文本內容voidselect(intselectionStart,intselectionEnd)在文本組件中選中指定的起始和結束位置之間的文本內容voidselectAll()在文本組件中選中所有文本內容voidsetEditable(booleanb)設置為可編輯或不可編輯狀態voidsetText(Stringt)設置文本組件中的文本內容voidsetDocument(Documentdoc)設置文本組件的文檔voidcopy()復制選中的文本到剪貼板voidcut()剪切選中的文本到剪貼板voidpaste()將剪貼板的內容粘貼到當前位置JComponent類中的常用方法publicbooleanrequestFocusInWindow()請求當前組件獲得輸入焦點文本域文本域是一個單行的文本輸入框,可用于輸入少量文本

構造方法JTextField()構造一個空文本域JTextField(intcolumns)構造一個具有指定列數的空文本域,int型參數columns指定文本域的列數文本域JTextField(Stringtext)構造一個顯示指定初始字符串的文本域,String型參數text指定要顯示的初始字符串JTextField(Stringtext,intcolumns)構造一個具有指定列數、并顯示指定初始字符串的文本域,String型參數text指定要顯示的初始字符串,int型參數columns指定文本域的列數文本域的常用方法voidaddActionListener(ActionListenerl)添加指定的操作偵聽器,接收操作事件voidremoveActionListener(ActionListenerl)移除指定的操作偵聽器,不再接收操作事件voidsetFont(Fontf)設置當前字體常用方法voidsetHorizontalAlignment(intalignment)設置文本的水平對齊方式,有效值包括:JTextField.LEFTJTextField.CENTERJTextField.RIGHTJTextField.LEADINGJTextField.TRAILINGintgetColumns()返回文本域的列數示例JTextFieldtf=newJTextField("SingleLine",30);這條命令創建一個列數為30、初始字符串為“SingleLine”的文本域在構造方法中所指定的列數,是一個希望的數值,由于組件的大小和位置通常是由布局管理器決定的,因此,指定的這些數據很有可能被忽略可以用setEditable(boolean)方法將文本域設定為可編輯或不可編輯狀態文本區文本區是一個多行多列的文本輸入框常用的構造方法JTextArea():構造一個空文本區JTextArea(Stringtext):構造一個顯示指定初始字符串的文本區,String型參數text指定要顯示的初始字符串JTextArea(introws,intcolumns):構造一個具有指定行數和列數的空文本區,int型參數rows和columns分別指定文本區的行數和列數JTextArea(Stringtext,introws,intcolumns):構造一個具有指定行數和列數、并顯示指定初始字符串的文本區,String型參數text指定要顯示的初始字符串,int型參數rows和columns指定文本區的行數和列數文本區JTextAreata=newJTextArea("Initialtext",4,30);創建一個4行、30列、顯示初始字符串“Initialtext”的文本區構造方法中指定的行數和列數只是希望的數值,文本區的大小仍然是由布局管理器決定的文本區本身不帶滾動條,由于文本區內顯示的內容通常比較多,因此一般將其放入滾動窗格JScrollPane中文本區常用方法voidappend(Stringstr)將指定文本str追加到文本區voidinsert(Stringstr,intpos)將指定文本str插入到文本區的特定位置pos處voidreplaceRange(Stringstr,intstart,intend)用指定文本str替換文本區中從起始位置start到結尾位置end的內容程序9.3第三節菜單組件菜單也是最常用的GUI組件之一Swing包中提供了多種菜單組件JMenuBarJMenuItemJmenuJCheckBoxMenuItemJRadioButtonMenuItemJPopupMenu等菜單有下拉式菜單和彈出式菜單兩種,本節介紹下拉式菜單菜單欄及菜單菜單欄是窗口中的主菜單,用來包容一組菜單菜單欄只有一種構造方法,即JMenuBar()JFrame、JApplet和JDialog等類中都定義了setJMenuBar(JMenuBarmenu)方法,可以把菜單欄放到窗口的上方JFrameframe=newJFrame(“MenuDemo”); //菜單窗口標題是“MenuDemo”JMenuBarmb=newJMenuBar(); //創建菜單欄frame.setJMenuBar(mb); //放到框架的上方菜單的常用構造方法JMenu()構造沒有文本的新菜單JMenu(Strings)構造具有指定標簽的新菜單,String型參數s指定了菜單上的文本JMenu(Strings,booleanb)構造具有指定標簽的新菜單,指示該菜單是否可以分離例9.1創建兩個菜單的示例菜單項常用的菜單項構造方法JMenuItem()創建不帶有設置文本或圖標的菜單項JMenuItem(Iconicon)創建一個只顯示圖標的菜單項,圖標由Icon型參數icon指定JMenuItem(Stringtext)創建一個只顯示文本的菜單項,文本由String型參數text指定JMenuItem(Stringtext,Iconicon)創建一個同時顯示文本和圖標的菜單項,文本由String型參數text指定,圖標由Icon型參數icon指定JMenuItem(Stringtext,intmnemonic)創建一個顯示文本并且有快捷鍵的菜單項,文本由String型參數text指定,快捷鍵由int型參數mnemonic指定添加菜單項示例快捷鍵也可以在菜單項被創建之后,通過setMnemonic(charmnemonic)方法進行設置在類中還定義了一個setAccelerator(KeyStrokekeyStroke)方法,使用該方法可以為菜單項設置加速鍵JMenuItemmenuItem=newJMenuItem("Open...");menuItem.setMnemonic(KeyEvent.VK_O);menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1,ActionEvent.ALT_MASK));在Menu類中定義有addSeparator()和insertSeparator(intindex)方法可以在某個菜單的各個菜單項間加入分隔線menu1.add(mi1);menu1.add(mi2);menu1.addSeparator();menu1.add(mi3);菜單項中還可以含有菜單項,組成嵌套的菜單當菜單中的菜單項被選中時,將會引發一個ActionEvent事件通常需要為菜單項注冊ActionListener以便對事件作出響應menuItem.addActionListener(this); //注冊偵聽器程序9.4復選菜單項和單選菜單項復選菜單項和單選菜單項是兩種特殊的菜單項,在復選菜單項前面有一個小方框,在單選菜單項前面有一個小圓圈可以對這兩類菜單項進行選中或不選中的操作復選菜單項構造方法JCheckBoxMenuItem()創建一個未設置文本或圖標、最初也未選定的復選框菜單項JCheckBoxMenuItem(Iconicon)創建一個有圖標、最初未被選定的復選框菜單項JCheckBoxMenuItem(Stringtext)創建一個帶文本、最初未被選定的復選框菜單項復選菜單項構造方法JCheckBoxMenuItem(Stringtext,booleanb)創建具有指定文本和選擇狀態的復選框菜單項JCheckBoxMenuItem(Stringtext,Iconicon)創建帶有指定文本和圖標、最初未被選定的復選框菜單項JCheckBoxMenuItem(Stringtext,Iconicon,booleanb)創建具有指定文本、圖標和選擇狀態的復選框菜單項單選菜單項的構造方法JRadioButtonMenuItem()創建一個未設置文本或圖標的單選按鈕菜單項。JRadioButtonMenuItem(Iconicon)創建一個帶圖標的單選按鈕菜單項JRadioButtonMenuItem(Iconicon,booleanselected)創建一個具有指定圖標和選擇狀態的單選按鈕菜單項,但無文本JRadioButtonMenuItem(Stringtext):創建一個帶文本的單選按鈕菜單項單選菜單項的構造方法JRadioButtonMenuItem(Stringtext,booleanselected)創建一個具有指定文本和選擇狀態的單選按鈕菜單項JRadioButtonMenuItem(Stringtext,Iconicon)創建一個具有指定文本和圖標的單選按鈕菜單項JRadioButtonMenuItem(Stringtext,Iconicon,booleanselected)創建一個具有指定的文本、圖標和選擇狀態的單選按鈕菜單項示例JCheckBoxMenuItemmi1=newJCheckBoxMenuItem(“Persistent”);//顯示Persistent、初態為未選中JCheckBoxMenuItemmi2=newJCheckBoxMenuItem(“transient”,true);//顯示transient、初態為選中當菜單項的狀態發生改變時,會引發ItemEvent事件,可以使用ItemListener中的itemStateChanged()對此事件進行響應通常在建立菜單系統時,可以首先創建一個菜單欄,并通過setMenuBar()方法將其放入某個框架中然后創建若干個菜單,通過add()方法將它們加入菜單欄中最后創建各個菜單項,通過add()方法將它們加入不同的菜單中第四節對話框對話框是一個臨時的可移動窗口,且要依賴于其他窗口當它所依賴的窗口消失或最小化時,對話框也將消失當窗口還原時,對話框會自動恢復一般地,要先創建一個窗口類,再創建一個對話框類,且讓對話框依附于窗口對話框分為強制型和非強制型兩種強制型對話框被關閉之前,其他窗口無法接收任何形式的輸入,也就是該對話過程不能中斷這樣的窗口也稱為模式窗口非強制型對話框可以中斷對話過程,去響應對話框之外的事件對話框的構造方法JDialog(Dialogowner)創建一個沒有標題但將指定的對話框作為其所有者的無模式對話框JDialog(Dialogowner,booleanmodal)創建一個沒有標題但有指定所有者的對話框,boolean型參數modal指定對話框是有模式或無模式JDialog(Dialogowner,Stringtitle)創建一個具有指定標題和指定所有者的無模式對話框對話框的構造方法JDialog(Dialogowner,Stringtitle,booleanmodal)創建一個具有指定標題和指定所有者的對話框,boolean型參數modal指定對話框是有模式或無模式JDialog(Frameowner)創建一個沒有標題但將指定的框架作為其所有者的無模式對話框JDialog(Frameowner,booleanmodal)創建一個沒有標題但有指定所有者的對話框,boolean型參數modal指定對話框是有模式或無模式對話框的構造方法JDialog(Frameowner,Stringtitle)創建一個具有指定標題和指定所有者框架的無模式對話框。JDialog(Frameowner,Stringtitle,booleanmodal)創建一個具有指定標題和指定所有者框架的對話框,boolean型參數modal指定對話框是有模式或無模式對話框的構造方法構造方法中的Dialog型或Frame型的參數,指定了對話框的擁有者,也就是它的依賴窗口JDialogdialog=newJDialog(frame,"Dialog",true);創建了一個標題為“Dialog”的模式對話框,該對話框為框架frame所擁有剛剛創建的對話框是不可見的,需要調用setVisible(true)方法才能將其顯示出來程序9.5標準對話框在Swing中還提供了用于顯示標準對話框的JOptionPane類在JOptionPane類中定義了多個showXxxDialog形式的靜態方法,可以分為以下4種類型:showConfirmDialog:確認對話框,顯示問題,要求用戶進行確認(yes/no/cancel)showInputDialog:輸入對話框,提示用戶進行輸入showMessageDialog:信息對話框,顯示信息,告知用戶發生了什么情況showOptionDialog:選項對話框,顯示選項,要求用戶進行選擇showXxxDialog方法的參數類型ComponentparentComponent對話框的父窗口對象,其屏幕坐標將決定對話框的顯示位置Stringtitle對話框的標題Objectmessage顯示在對話框中的描述信息intmessageType對話框所傳遞的信息類型intoptionType對話框上按鈕的類型Object[]options對話框上的選項Iconicon對話框上顯示的裝飾性圖標,如果沒有指定,則根據messageType參數顯示默認圖標ObjectinitialValue初始選項或輸入值文件對話框文件對話框是專門用于對文件(或目錄)進行瀏覽和選擇的對話框常用的構造方法JFileChooser():構造一個指向用戶默認目錄的文件對話框JFileChooser(FilecurrentDirectory):使用給定的File作為路徑來構造一個文件對話框JFileChooser(StringcurrentDirectoryPath):構造一個使用給定路徑的文件對話框剛剛創建的文件對話框是不可見的,可以調用以下方法將其顯示出來:showOpenDialog(Componentparent):彈出一個"打開"文件對話框showSaveDialog(Componentparent):彈出一個"保存"文件對話框程序9.6ThankYou!第十章多線程

學習目標能夠敘述線程和多線程的概念,線程各種狀態之間轉換的條件,線程的優先級能夠使用Thread類和Runnabe接口創建線程能夠對線程進行控制,實現線程之間的互斥和同步本章主要內容線程和多線程12線程的基本控制3創建線程線程的互斥4線程的同步5線程的概念程序是一段靜態的代碼,它是應用程序執行的藍本一個進程既包括其所要執行的指令,也包括了執行指令所需的任何系統資源,如CPU、內存空間、I/O端口等,不同進程所占用的系統資源相對獨立線程是進程執行過程中產生的多條執行線索,是比進程單位更小的執行單位線程的結構在Java中,線程由3部分組成:虛擬CPU,封裝在java.lang.Thread類中,它控制著整個線程的運行執行的代碼,傳遞給Thread類,由Thread類控制按序執行處理的數據,傳遞給Thread類,是在代碼執行過程中所要處理的數據當一個線程被構造時,它由構造方法參數、執行代碼、操作數據來初始化一個線程所執行的代碼與其他線程可以相同也可以不同一個線程訪問的數據與其他線程可以相同也可以不同多線程的優勢使用多線程可以在線程間直接共享數據和資源,而多進程之間不能做到這一點使用多線程適合于開發有多種交互接口的程序多線程的機制可以減輕編寫交互頻繁、涉及面多的程序的困難,如偵聽網絡端口的程序線程的狀態線程一共有4種狀態,分別是新建、可運行狀態、死亡及阻塞新建線程對象剛剛創建,還沒有啟動,此時還處于不可運行狀態此時剛創建的線程處于新建狀態,但已有了相應的內存空間以及其它資源可運行狀態此時的線程已經啟動,線程可能正在運行,也可能沒有運行,只要CPU一空閑,馬上就會運行可以運行但沒在運行的線程都排在一個隊列中,這個隊列稱為就緒隊列可運行狀態中,正在運行的線程處于運行狀態,等待運行的線程處于就緒狀態一般地,單CPU情況下,最多只有一個線程處于運行狀態,可能會有多個線程處于就緒狀態調用線程的start()方法可使線程處于“可運行”狀態死亡線程死亡的原因有兩個一是run()方法中最后一個語句執行完畢二是當線程遇到異常退出時便進入了死亡狀態阻塞一個正在執行的線程因特殊原因,被暫停執行,就進入阻塞狀態阻塞時線程不能進入就緒隊列排隊,必須等到引起阻塞的原因消除,才可重新進入隊列排隊引起阻塞的原因很多,不同原因要用不同的方法解除sleep()和wait()是兩個常用的引起阻塞的方法中斷線程在程序中常常調用interrupt()來終止線程interrupt()不僅可中斷正在運行的線程,而且也能中斷處于blocked狀態的線程interrupt()會拋出InterruptedException異常測試線程是否被中斷的方法voidinterrupt()向一個線程發送一個中斷請求,同時把這個線程的“interrupted”狀態置為true。若該線程處于“blocked”狀態,會拋出InterruptedException異常staticbooleaninterrupted()檢測當前線程是否已被中斷,并重置狀態“interrupted”值。即如果連續兩次調用該方法,則第二次調用將返回falsebooleanisInterrupted()檢測當前線程是否已被中斷,不改變狀態“interrupted”值第二節創建線程創建線程有兩種方法繼承Thread類創建線程實現Runnable接口創建線程繼承Thread類java.lang.Thread是Java中用來表示線程的類如果將一個類定義為Thread的子類,那么這個類的對象就可以用來表示線程類Thread中典型的構造方法Thread(ThreadGroupgroup,Runnabletarget,Stringname)name作為新線程的名稱,且是線程組group中的一員target必須實現接口Runnable,它是另一個線程對象創建線程的過程從Thread類派生出一個子類,在類中實現run()classLefthandextendsThread{ publicvoidrun(){……} //線程體}然后用該類創建一個對象Lefthandleft=newLefthand();用start()方法啟動線程left.start();程序10.1實現Runnable接口創建線程Runnable是Java中用以實現線程的接口,從任何實現線程功能的類都必須實現該接口Thread類實際上就是因為實現了Runnable接口,所以它的子類才相應具有線程功能Runnable接口中只定義了一個方法就是run()方法,也就是線程體用Runnable()接口實現多線程時,也必須實現run()方法,也需要使用start()啟動線程編寫線程體publicclassxyzimplementsRunnable{ inti; publicvoidrun(){ while(true){

System.out.println("Hello"+i++); } }}利用類xyz可以構造一個線程Runnabler=newxyz();Threadt=newThread(r);程序10.2創建線程兩種方法的適用條件適用于采用實現Runnable接口方法的情況因為Java只允許單繼承,如果一個類已經繼承了Thread,就不能再繼承其他類,在一些情況下,這就被迫采用實現Runnable的方法另外,由于原來的線程采用的是實現Runnable接口的方法,可能會出于保持程序風格的一貫性而繼續使用這種方法創建線程兩種方法的適用條件適用于采用繼承Thread方法的情況當一個run()方法置于Thread類的子類中時,this實際上引用的是控制當前運行系統的Thread實例,所以,代碼不必寫得像下面這樣繁瑣:Thread.currentThread().getState();而可簡單地寫為:getState();可以直接調用Thread類中的方法,代碼直觀,所以許多Java程序員愿意使用繼承Thread的方法第三節線程的基本控制線程的啟動要使線程真正在Java環境中運行,必須通過方法start()來啟動start()方法也在Thread類中線程的操作方法start()啟動線程對象,讓線程從新建狀態轉為就緒狀態run()用來定義線程對象被調度之后所執行的操作,用戶必須重寫run()方法yield()強制終止線程的執行isAlive()測試當前線程是否在活動sleep(intmillsecond)使線程休眠一段時間,時間長短由millsecond決定,單位為毫秒voidwait()使線程處于等待狀態線程的調度雖然就緒線程已經可以運行,但這并不意味著這個線程一定能夠立刻運行CPU在同一時間只能分配給一個線程做一件事那么當有多于一個的線程工作時,CPU是如何分配的?這就是線程的調度問題在Java中,線程調度通常是搶占式,而不是時間片式搶占式調度是指可能有多個線程準備運行,但只有一個在真正運行一個線程獲得執行權,這個線程將持續運行下去,直到它運行結束或因為某種原因而阻塞,再或者有另一個高優先級線程就緒,最后一種情況稱為低優先級線程被高優先級線程所搶占線程調度采用的優先級策略優先級高的先執行,優先級低的后執行每個線程創建時都會被自動分配一個優先級,默認時,繼承其父類的優先級任務緊急的線程,其優先級較高同優先級的線程按“先進先出”的調度原則與線程優先級有關的靜態量MAX_PRIORITY:最高優先級,值為10MIN_PRIORITY:最低優先級,值為1NORM_PRIORITY:默認優先級,值為5有關優先級的常用方法voidsetPriority(intnewPriority)重置線程優先級intgetPriority()獲得當前線程的優先級staticvoidyield()暫停當前正在執行的線程,即讓當前線程放棄執行權線程被阻塞的原因可能是因為執行了Thread.sleep()調用,故意讓它暫停一段時間也可能是因為需要等待一個較慢的外部設備例如磁盤或用戶操作的鍵盤線程隊列所有被阻塞的線程按次序排列,組成一個阻塞隊列所有就緒但沒有運行的線程則根據其優先級排入一個就緒隊列當CPU空閑時,如果就緒隊列不空,隊列中第一個具有最高優先級的線程將運行當一個線程被搶占而停止運行時,它的運行態被改變并放到就緒隊列的隊尾同樣,一個被阻塞的線程就緒后通常也放到就緒隊列的隊尾結束線程當一個線程從run()方法的結尾處返回時,它自動消亡并且不能再被運行,可以將其理解為自然死亡另一種情況是遇到異常使得線程結束,可以將其理解為強迫死亡還可以使用interrupt()方法中斷線程的執行查詢線程狀態在程序代碼中,可以利用Thread類中的靜態方法currentThread()來引用正在運行的線程有時候可能不知道一個線程的運行狀態,這時可以使用方法isAlive()來獲取一個線程是否還在活動狀態的信息活動狀態不意味著這個線程正在執行,而只說明這個線程已被啟動掛起線程暫停一個線程也稱為掛起在掛起之后,必須重新喚醒線程進入運行掛起線程的方法——sleep()方法sleep()用于暫時停止一個線程的執行掛起喚醒線程不是休眠期滿后就立刻被喚醒,因為此時其他線程可能正在執行重新調度只在以下幾種情況下才會發生被喚醒的線程具有更高的優先級正在執行的線程因為其他原因被阻塞程序處于支持時間片的系統中掛起線程的方法wait()和notify()/notifyAll()方法wait()方法導致當前的線程等待,直到其他線程調用此對象的notify()方法或notifyAll()方法,才能喚醒線程join()方法join()將引起現行線程等待,直至方法join()所調用的線程結束比如在線程B中調用了線程A的join()方法,直到線程A執行完畢后,才會繼續執行線程B可以想像成將線程A加入到當前線程B中第四節線程的互斥一些同時運行的線程需要共享數據此時,每個線程就必須要考慮與它一起共享數據的其他線程的狀態與行為,否則的話就不能保證共享數據的一致性,因而也就不能保證程序的正確性棧的示例棧具有“后進先出”模式,它使用下標值idx表示棧中下一個放置元素的位置有兩個獨立的線程A和B都具有對這個類的同一個對象的引用,線程A負責入棧,線程B負責出棧要求線程A放入棧中的數據都要由線程B讀出,不重不漏假設此時棧中已經有字符1和2,當前線程A要入棧一個字符3,調用push(3),執行了語句data[idx]=c;后被其他線程搶占了,此時尚未執行idx++語句。故idx指向最后入棧的字符的下標data123idx=2^如果此時線程A馬上被喚醒,可以繼續修正idx的值,從而完成一次完整的入棧操作如若不然,入棧操作執行了一半若恰巧線程B此時正占有CPU,調用pop(),執行出棧操作,則它返回的字符是2,因為它先執行idx--語句,idx的值變為1,返回的是data[1]處的字符,即字符2字符3被漏掉了多線程訪問共享數據時通常會引起問題產生這種問題的原因是對共享資源訪問的不完整性需要尋找一種機制來保證對共享數據操作的完整性這種完整性稱為共享數據操作的同步共享數據叫做條件變量鎖定標志可以禁止線程在完成代碼關鍵部分時被切換這個關鍵代碼部分,對于線程A就是入棧操作及下標值增加這兩個動作,對于線程B就是下標值遞減及出棧操作這兩個動作它們要么一起完成,要么都不執行在Java中,提供了一個特殊的鎖定標志來處理共享數據的訪問對象的鎖定標志引入“對象互斥鎖”的概念,也稱為監視器使用它來實現不同線程對共享數據操作的同步“對象互斥鎖”阻止多個線程同時訪問同一個條件變量Java可以為每一個對象的實例配有一個“對象互斥鎖”實現“對象互斥鎖”的方法用關鍵字synchronized來聲明一個方法或一段代碼塊,該方法或代碼塊在執行時會獲取對象實例的內置鎖,其他線程必須等待鎖的釋放才能訪問該方法或代碼塊中的共享數據使用關鍵字volatile來聲明一個共享數據(變量)。但是,使用volatile關鍵字只能保證數據的可見性和有序性,無法實現對共享數據的原子操作,因此不能完全替代使用synchronized實現同步鎖定標志示例classstack{ intidx=0; chardata[]=newchar[6]; publicvoidpush(charc){ synchronized(this){//增加同步標志 data[idx]=c;

idx++; } }}鎖定標志方法publiccharpop(){ synchronized(this){ //增加同步標志

idx--; returndata[idx]; }}synchronized(this)現在pop()和push()操作的部分增加了一個對synchronized(this)的調用,在第一個線程擁有鎖定標記時,如果另一個線程企圖執行synchronized(this)中的語句時,它將從對象this中索取鎖定標記因為這個標記不可得,故該線程不能繼續執行實際上這個線程將加入一個等待隊列,該等待隊列與對象鎖定標志相連,當標志被返還給對象時,等待標志的第一個線程將得到該標志并繼續運行因為等待一個對象的鎖定標志的線程要等到持有該標志的線程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論