實(shí)驗(yàn)五 多線程程序設(shè)計(jì)_第1頁
實(shí)驗(yàn)五 多線程程序設(shè)計(jì)_第2頁
實(shí)驗(yàn)五 多線程程序設(shè)計(jì)_第3頁
實(shí)驗(yàn)五 多線程程序設(shè)計(jì)_第4頁
實(shí)驗(yàn)五 多線程程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

實(shí)驗(yàn)五多線程程序設(shè)計(jì)實(shí)驗(yàn)?zāi)康恼莆認(rèn)ava語言中多線程編程的基本方法掌握Runnable接口實(shí)現(xiàn)多線程的方法掌握Thread類實(shí)現(xiàn)多線程的用法實(shí)驗(yàn)導(dǎo)讀進(jìn)程和線程的概念進(jìn)程是程序一次動(dòng)態(tài)執(zhí)行的過程,對(duì)應(yīng)從代碼加載、執(zhí)行到執(zhí)行結(jié)束這樣一個(gè)完整的過程,也是進(jìn)程自身從產(chǎn)生、發(fā)展到消亡的過程。線程是比進(jìn)程更小的執(zhí)行單元,一個(gè)進(jìn)程在執(zhí)行過程中,可以產(chǎn)生多個(gè)線程。每個(gè)線程都有自身的產(chǎn)生、執(zhí)行和消亡的過程。線程的狀態(tài)與生命周期新建:當(dāng)一個(gè)Thread類或其子類的對(duì)象被聲明并創(chuàng)建時(shí),新生的線程對(duì)象處于新建狀態(tài)。此時(shí)它已經(jīng)有了相應(yīng)的內(nèi)存空間和其他資源。運(yùn)行:線程創(chuàng)建之后就具備了運(yùn)行的條件,一旦輪到它來享用CPU資源時(shí),即JVM將CPU使用權(quán)切換給該線程時(shí),此線程的就可以脫離創(chuàng)建它的主線程獨(dú)立開始自己的生命周期了(即run方法執(zhí)行的過程)。中斷:有4種原因的中斷,CPU資源從當(dāng)前線程切換給其他線程、執(zhí)行了sleep(intmillsecond)方法、執(zhí)行了wait()方法、進(jìn)入阻塞狀態(tài)。死亡:run方法結(jié)束。線程的創(chuàng)建在Java語言中,與線程支持密切相關(guān)的是java.lang.Thread類和java.lang.Runnable接口。Runnable接口定義很簡單,只有一個(gè)run方法。任何一個(gè)類如果希望自己的實(shí)例能夠以線程的形式執(zhí)行,都可以來實(shí)現(xiàn)Runnable接口。繼承Thread類和實(shí)現(xiàn)Runnable接口,都可以用來創(chuàng)建Thread對(duì)象,效果上并沒有什么不同。繼承Thread類的方法很明顯的缺點(diǎn)就是這個(gè)類不能再繼承其他的類了,而實(shí)現(xiàn)Runnable接口不會(huì)有這個(gè)麻煩。另外,在繼承Thread類的代碼中,this其實(shí)就是指當(dāng)前正在運(yùn)行的線程對(duì)象,如果使用實(shí)現(xiàn)Runnable接口的方式,要得到當(dāng)前正在執(zhí)行的線程,需要使用Thread.currentThread()方法。線程創(chuàng)建后僅僅是占有了內(nèi)存資源,在JVM管理的線程中還沒有這個(gè)線程,此線程必須調(diào)用start()方法(從父類繼承的方法)通知JVM,這樣JVM就會(huì)知道又有一個(gè)新一個(gè)線程排隊(duì)等候切換了。注意:多次啟動(dòng)一個(gè)線程,或者啟動(dòng)一個(gè)已經(jīng)運(yùn)行的線程對(duì)象是非法的,會(huì)拋出IllegalThreadStateException異常對(duì)象。線程的優(yōu)先級(jí)同一時(shí)刻在等待隊(duì)列中的線程會(huì)有很多個(gè),它們各自任務(wù)的重要性有所不同。為了加以區(qū)分,使工作安排和資源分配時(shí)間更為合理,每個(gè)線程可以被賦予不同的優(yōu)先級(jí),讓任務(wù)比較急的線程擁有更高的優(yōu)先級(jí),從而更快地進(jìn)入執(zhí)行狀態(tài)。Java中提供了10個(gè)等級(jí)的線程優(yōu)先級(jí),最低為Thread.MIN_PRIORITY=1,最高為Thread.MAX_PRIORITY=10,默認(rèn)優(yōu)先級(jí)為Thread.NORM_PRIORITY=5。使用Thread類中的setPriority(int)方法可以為線程指定優(yōu)先級(jí)。線程的常用方法start()方法:線程調(diào)用該方法將啟動(dòng)線程,使之從新建狀態(tài)進(jìn)入就緒隊(duì)列排隊(duì),一旦輪到它來享用CPU資源時(shí),就可以脫離創(chuàng)建它的線程獨(dú)立開始自己的生命周期了。run()方法:Thread類的run()方法與Runnable接口中的run()方法的功能和作用相同,都用來定義線程對(duì)象被調(diào)度之后所執(zhí)行的操作,都是系統(tǒng)自動(dòng)調(diào)用而用戶程序不得引用的方法。系統(tǒng)的Thread類中,run()方法沒有具體內(nèi)容,所以用戶程序需要?jiǎng)?chuàng)建自己的Thread類的子類,并重寫run()方法來覆蓋原來的run()方法。當(dāng)run方法執(zhí)行完畢,線程就變成死亡狀態(tài)。sleep(intmillsecond)方法:現(xiàn)程占有CPU期間,執(zhí)行sleep方法來使自己放棄CPU資源,休眠一段時(shí)間。休眠時(shí)間的長短由sleep方法的參數(shù)決定,millsecond是毫秒為單位的休眠時(shí)間。如果線程在休眠時(shí)被打斷,JVM就拋出InterruptedException異常。因此,必須在try~catch語句塊中調(diào)用sleep方法。isAlive()方法:線程處于“新建”狀態(tài)時(shí),線程調(diào)用isAlive()方法返回false。當(dāng)一個(gè)線程調(diào)用start()方法,并占有CUP資源后,該線程的run方法就開始運(yùn)行,在線程的run方法結(jié)束之前,即沒有進(jìn)入死亡狀態(tài)之前,線程調(diào)用isAlive()方法返回true。當(dāng)線程進(jìn)入“死亡”狀態(tài)后(實(shí)體內(nèi)存被釋放),線程仍可以調(diào)用方法isAlive(),這時(shí)返回的值是false。一個(gè)已經(jīng)運(yùn)行的線程在沒有進(jìn)入死亡狀態(tài)時(shí),不要再給線程分配實(shí)體,由于線程只能引用最后分配的實(shí)體,先前的實(shí)體就會(huì)成為“垃圾”,并且不會(huì)被垃圾收集機(jī)收集掉。currentThread()方法:currentThread()方法是Thread類中的類方法,可以用類名調(diào)用,該方法返回當(dāng)前正在使用CPU資源的線程。interrupt()方法:intertupt方法經(jīng)常用來“吵醒”休眠的線程。當(dāng)一些線程調(diào)用sleep方法處于休眠狀態(tài)時(shí),一個(gè)占有CPU資源的線程可以讓休眠的線程調(diào)用interrupt方法“吵醒”自己。線程的同步線程同步是指幾個(gè)線程都需要調(diào)用一個(gè)同步方法(使用關(guān)鍵字synchronized修飾的方法)。當(dāng)一個(gè)線程A使用一個(gè)synchronized修飾的方法時(shí),其他線程想使用這個(gè)方法時(shí)就必須等待,直到線程A使用完該方法(除非線程A使用wait主動(dòng)讓出CPU資源)。一個(gè)線程在使用的同步方法中時(shí),可能根據(jù)問題的需要,必須使用wait()方法使本線程等待,暫時(shí)讓出CPU的使用權(quán),并允許其它線程使用這個(gè)同步方法。其它線程如果在使用這個(gè)同步方法時(shí)如果不需要等待,那么它用完這個(gè)同步方法的同時(shí),應(yīng)當(dāng)執(zhí)行notifyAll()方法通知所有的由于使用這個(gè)同步方法而處于等待的線程結(jié)束等待。掛起:有時(shí)候兩個(gè)線程并不是同步的,即不涉及都需要調(diào)用一個(gè)同步方法,但線程也可能需要暫時(shí)的掛起。所謂掛起一個(gè)線程就是讓線程暫時(shí)讓出CPU的使用權(quán)限,暫時(shí)停止執(zhí)行,但停止執(zhí)行的持續(xù)時(shí)間不確定,因此不能使用sleep方法暫停線程。掛起一個(gè)線程需使用wait方法,即讓準(zhǔn)備掛起的線程調(diào)用wait方法,主動(dòng)讓出CPU的使用權(quán)限.恢復(fù):為了恢復(fù)該線程,其它線程在占有CUP資源期間,讓掛起的線程的目標(biāo)對(duì)象執(zhí)行notifyAll()方法,使得掛起的線程繼續(xù)執(zhí)行;如果線程沒有目標(biāo)對(duì)象,為了恢復(fù)該線程,其它線程在占有CUP資源期間,讓掛起的線程調(diào)用notifyAll()方法,使掛起的線程繼續(xù)執(zhí)行。實(shí)驗(yàn)內(nèi)容1.漢字識(shí)別程序編寫一個(gè)Java應(yīng)用程序,在主線程中再創(chuàng)建一個(gè)Frame類型的窗口,在該窗口中再創(chuàng)建一個(gè)線程giveWord。線程giveWord每隔6秒鐘給出一個(gè)漢字,用戶使用一種漢字輸入法將該漢字輸入到文本框中。請(qǐng)按模板要求,將代碼補(bǔ)充完整。WordThread.javaimportjava.awt.大;publicclassWordThreadextendsThread{charword;Labelcom;WordThread(Labelcom){=com;}publicvoidrun(){while(true){word=(char)(Math.random()*(29968-19968)+19968);System.out.println(word);com.setText(""+word);try{【補(bǔ)充代碼】//調(diào)用sleep方法使得線程中斷6000豪秒}catch(InterruptedExceptione){}}}}ThreadFrame.javapublicclassThreadFrameextendsFrameimplementsActionListener{LabelwordLabel;Buttonbutton;TextFieldinputText,scoreText;【補(bǔ)充代碼】//用WordThread聲明一個(gè)giveWord對(duì)象intscore=0;ThreadFrame(){wordLabel=newLabel("",Label.CENTER);wordLabel.setFont(newFont("",Font.BOLD,72));button=newButton("開始");inputText=newTextField(3);scoreText=newTextField(5);scoreText.setEditable(false);【補(bǔ)充代碼】//創(chuàng)建giveWord,將wordLabel傳遞給WordThread構(gòu)造方法的參button.addActionListener(this);inputText.addActionListener(this);add(button,BorderLayout.NORTH);add(wordLabel,BorderLayout.CENTER);PanelsouthP=newPanel();southP.add(newLabel(”輸入標(biāo)簽所顯示的漢字后回車:"));southP.add(inputText);southP.add(scoreText);add(southP,BorderLayout.SOUTH);setBounds(100,100,350,180);setVisible(true);validate();addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}publicvoidactionPerformed(ActionEvente){if(e.getSource()==button){if(!(【補(bǔ)充代碼】))//giveWord調(diào)用方法isAlive(){giveWord=newWordThread(wordLabel);}try{【補(bǔ)充代碼】//giveWord調(diào)用方法start()}catch(Exceptionexe){}}elseif(e.getSource()==inputText){if(inputText.getText().equals(wordLabel.getText())){score++;}scoreText.setText("得分:”+score);inputText.setText(null);}}}WordThread.javapublicclassThreadWordMainClass{publicstaticvoidmain(Stringargs[]){newThreadFrame();答案代碼:WordThread.javaimportjava.awt.*;publicclassWordThreadextendsThread{charword;Labelcom;WordThread(Labelcom){=com;}publicvoidrun(){while(true){word=(char)(Math.random()*(29968-19968)+19968);System.out.println(word);com.setText(""+word);try{sleep(6000);//調(diào)用sleep方法使得線程中斷6000豪秒}catch(InterruptedExceptione){}}}}ThreadFrame.javapublicclassThreadFrameextendsFrameimplementsActionListener{LabelwordLabel;Buttonbutton;TextFieldinputText,scoreText;WordThreadgiveWord;//用WordThread聲明一個(gè)giveWord對(duì)象intscore=0;ThreadFrame(){wordLabel=newLabel("”,Label.CENTER);wordLabel.setFont(newFont("”,Font.BOLD,72));button=newButton(”開始”);inputText=newTextField(3);scoreText=newTextField(5);scoreText.setEditable(false);giveWord=newWordThread(wordLabel);//創(chuàng)建giveWord,將wordLabel傳遞給WordThread構(gòu)造方法的參數(shù)button.addActionListener(this);inputText.addActionListener(this);add(button,BorderLayout.NQRTE);add(wordLabel,BorderLayout.CENTER);PanelsouthP=newPanel();southP.add(newLabel("輸入標(biāo)簽所顯示的漢字后回車:"));southP.add(inputText);southP.add(scoreText);add(southP,BorderLayout.SOUTH);setBounds(100,100,350,180);setVisible(true);validate();addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}publicvoidactionPerformed(ActionEvente){if(e.getSource()==button){if(!(giveWord.isAlive()))//giveWord調(diào)用方法isAlive(){giveWord=newWordThread(wordLabel);}try{giveWord.start();//【補(bǔ)充代碼】//giveWord調(diào)用方法start()}catch(Exceptionexe){}}elseif(e.getSource()==inputText){if(inputText.getText().equals(wordLabel.getText())){score++;}scoreText.setText("得分:"+score);inputText.setText(null);}}}WordThread.javapublicclassThreadWordMainClass{publicstaticvoidmain(Stringargs[]){newThreadFrame();}2.雙線程接力編寫一個(gè)應(yīng)用程序,除了主線程外,還有兩個(gè)線程:first和secondofirst負(fù)責(zé)模擬一個(gè)紅色的按鈕從坐標(biāo)(10,60)運(yùn)動(dòng)到(100,60);second負(fù)責(zé)模擬一個(gè)綠色的按鈕從坐標(biāo)(100,60)運(yùn)動(dòng)到(200,60)o閱讀并分析以下程序,將程序中的代碼補(bǔ)充完整,編譯并運(yùn)行程序,查看結(jié)果。MoveButton.javaimportjava.awt.*;importjava.awt.event.*;publicclassMoveButtonextendsFrameimplementsRunnable,ActionListener(【補(bǔ)充代碼】〃用Thread類聲明first,second兩個(gè)線程對(duì)象ButtonredButton,greenButton,startButton;intdistance=10;MoveButton()(【補(bǔ)充代碼】//創(chuàng)建first線程,當(dāng)前窗口做為該線程的目標(biāo)對(duì)象【補(bǔ)充代碼】//創(chuàng)建first線程,當(dāng)前窗口做為該線程的目標(biāo)對(duì)象redButton=newButton();greenButton=newButton();redButton.setBackground(Color.red);greenButton.setBackground(Color.green);startButton=newButton("start");startButton.addActionListener(this);setLayout(null);add(pedButton);redButton.setBounds(10,60,15,15);add(greenButton);greenButton.setBounds(100,60,15,15);add(startButton);startButton.setBounds(10,100,30,30);setBounds(0,0,300,200);setVisible(true);validate();addWindowListener(newWindowAdapter()publicvoidwindowClosing(WindowEvente)(Systemcit(0);}});}publicvoidactionPerformed(ActionEvente)(try(first.start();second.start();}catch(Exceptionexp)(}}publicvoidrun()(while(true)(if(【補(bǔ)充代碼】)〃判斷當(dāng)前占有CPU資源的線程是否是first(moveComponentredButton);try(Thread.sLeep(20);}catch(Exceptionexp)(}}if(【補(bǔ)充代碼】)//判斷當(dāng)前占有CPU資源的線程是否是second(moveComponentgreenButton);try(Thread.sLeep(10);}catch(Exceptionexp)(}}}}publicsynchronizedvoidmoveComponent(Componentb)(if(Thread.currentThread()==first)(while(distance>100&&distance<=200)try(wait();}catch(Exceptionexp)(}distance=distance+1;b.setLocationdistance,60);if(distance>=100)(b.setLocation(10,60);notifyAll();}}if(Thread.currentThread()==second)(while(distance>=10&&distance<100)try(wait();}catch(Exceptionexp)(}distance=distance+1;b.setLocationdistance,60);if(distance>200)(distance=10;b.setLocation(100,60);notifyAll();}MoveButtonMainClass.javapublicclassMoveButtonMainClass(publicstaticvoidmain(Stringargs[])(newMoveButton();}}答案:MoveButton.javaimportjava.awt.*;importjava.awt.event.*;publicclassMoveButtonextendsFrameimplementsRunnable,ActionListener{/****/privatestaticfinallongseriaLVersionUID=1L;Threadfirst,second;〃用Thread類聲明first,second兩個(gè)線程對(duì)象ButtonredButton,greenButton,startButton;intdistance=10;MoveButton(){first=newThread(this);〃創(chuàng)建first線程,當(dāng)前窗口做為該線程的目標(biāo)對(duì)象second=newThread(this);〃創(chuàng)建first線程,當(dāng)前窗口做為該線程的目標(biāo)對(duì)象redButton=newButton();greenButton=newButton();redButton.setBackground(Color.red);greenButton.setBackground(Color.green);startButton=newButton("start");startButton.addActionListener(this);setLayout(null);add(nedButton);redButton.setBounds(10,60,15,15);add(greenButton);greenButton.setBounds(100,60,15,15);add(startButton);startButton.setBounds(10,100,30,30);setBounds(0,0,300,200);setVisible(true);validate();addWindowListener(newWindowAdapter()publicvoidwindowClosing(WindowEvente){SysteBKit(0);}});}publicvoidactionPerformed(ActionEvente){try{first.start();second.start();}catch(Exceptionexp){}}publicvoidrun(){while(true){if(Thread.currentThread()==first)〃判斷當(dāng)前占有CPU資源的線程是否是first{moveComponentredButton);try{Thread.sCeep(20);}catch(Exceptionexp){}}if(Thread.currentThread()==second)〃判斷當(dāng)前占有CPU資源的線程是否是second{moveComponentgreenButton);try{Thread.sLeep(10);}catch(Exceptionexp){}}}}publicsynchronizedvoidmoveComponent(Componentb){if(Thread.currentThread()==first){while(distance>100&&distance<=200)try{wait();}catch(Exceptionexp){}distance=distance+1;b.setLocationdistance,60);if(distance>=100){b?setLocation(10,60);notifyAll();}}if(Thread.currentThread()==second){while(distance>=10&&distance<100)try{wait();}catch(Exceptionexp){}distance=distance+1;b.setLocationdistance,60);if(distance>200){distance=10;b.setLocation(100,60);notifyAll();}}}}MoveButtonMainClass.javapublicclassMoveButtonMainClass{publicstaticvoidmain(Stringargs[]){newMoveButton();}}匹

1=1練習(xí):在MoveButton類中再增加一個(gè)藍(lán)色的按鈕和一個(gè)匹

1=1線程,third線程負(fù)責(zé)將這個(gè)藍(lán)色的按鈕從(200,60)運(yùn)動(dòng)到(300,60)。MoveButton.javaimportjava.awt.*;importjava.awt.event.*;publicclassMoveButtonextendsFrameimplementsRunnable,ActionListener{/****/privatestaticfinallongserialVersionUID=1L;Threadfirst,second,third;//【補(bǔ)充代碼】//用Thread類聲明first,second兩個(gè)線程對(duì)象ButtonredButton,greenButton,blueButton,startButton;intdistance=10;MoveButton(){first=newThread(this);//【補(bǔ)充代碼】〃創(chuàng)建first線程,當(dāng)前窗口做為該線程的目標(biāo)對(duì)象second=newThread(this);//【補(bǔ)充代碼】〃創(chuàng)建first線程,當(dāng)前窗口做為該線程的目標(biāo)對(duì)象third=newThread(this);redButton=newButton();greenButton=newButton();blueButton=newButton();redButton.setBackground(Color.red);greenButton.setBackground(Color.green);blueButton.setBackground(Color.blue);startButton=newButton("start");startButton.addActionListener(this);setLayout(null);add(pedButton);redButton.setBounds(10,60,15,15);add(greenButton);greenButton.setBounds(100,60,15,15);add(blueButton);blueButton.setBounds(200,60,15,15);add(startButton);startButton.setBounds(10,100,30,30);setBounds(0,0,350,200);setVisible(true);validate();addWindowListenernewWindowAdapter()publicvoidwindowClosing(WindowEvente){Systemdt(0);}});}publicvoidactionPerformed(ActionEvente){try{first.start();second.start();third.start();}catch(Exceptionexp)(}}publicvoidrun(){while(true){if(Thread.currentThread()==first)〃判斷當(dāng)前占有CPU資源的線程是否是first{moveComponentredButton);try{Thread.sleep(20);}catch(Exceptionexp){}}if(Thread.currentThread()==second)〃判斷當(dāng)前占有CPU資源的線程是否是second{moveComponentgreenButton);try{Thread.sleep(10);}catch(Exceptionexp){}}if(Thread.currentThread()==third){moveComponent(blueButton);try{Thread.sleep(50);}catch(Exceptionexp)(}}}publicsynchronizedvoidmoveComponent(Componentb){if(Thread.currentThread()==first){while(distance>100&&distance<=300)try{wait();}catch(Exceptionexp){}distance=distance+1;b.setLocationdistance,60);if(distance>=100){b?setLocation(10,60);notifyAll();}}if(Thread.currentThread()==second){while(distance>=10&&distance<100)try{wait();)catch(Exceptionexp)(}distance=distance+1;b.setLocationdistance,60);if(distance>200){//distance=10;b?setLocation(100,60);notifyAll();}}if(Thread.currentThread()==third){while(distance>=10&&distance<200)try{wait();}catch(Exceptionexp){}distance=distance+1;b?setLocation(distance,60);if(distance>300){distance=10;b.setLocation(200,60);notifyAll();}MoveButtonMainClass.javapublicclassMoveButtonMainClass{publicstaticvoidmain(Stringargs[]){newMoveButton();3.線程的控制編寫一個(gè)程序,動(dòng)畫顯示文本域中的字符串。1)閱讀并分析以下程序,將程序中的代碼補(bǔ)充完整,編譯并運(yùn)行程序,查看結(jié)果。importjava.awt.BorderLayout;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JTextArea;importjavax.swing.border.BevelBorder;publicclassRunnableDemoextendsJFrameimplementsRunnable(//動(dòng)畫顯示的文本字符串privateStringintroduction="現(xiàn)在大家已經(jīng)對(duì)計(jì)算機(jī)很熟悉了,如今計(jì)算機(jī)的操作"+”系統(tǒng)可以同時(shí)執(zhí)行多個(gè)任務(wù),在聽歌的同時(shí)能夠打字、下載文件,在聊天窗口打"+”字的時(shí)候,對(duì)方同時(shí)還能通過視頻看到你;聽到你。這一切都是使用多任務(wù)實(shí)現(xiàn)"+”的,Java語言使用多線程實(shí)現(xiàn)一個(gè)程序中的多個(gè)任務(wù)同時(shí)運(yùn)行。程序員可以在程"+”序中執(zhí)行多個(gè)線程,每一個(gè)線程完成一個(gè)功能,并與其他線程并發(fā)執(zhí)行,這種機(jī)"+”制被稱為多線程?!?;JTextAreatextArea;//文本域組件JLabellabel;Threadthread;publicRunnableDemo()(setTitle("線程的控制");label=newJLabel("多線程簡介:”);//標(biāo)簽組件getContentPane().add(label,BorderLayout.NORTH);//添加標(biāo)簽到窗體textArea=newJTextArea("\t");//初始化文本域組件textArea.setBorder(newBevelBorder(BevelBorder.LOWERED));//設(shè)置邊框textArea.setLineWrap(true);//設(shè)置自動(dòng)折行g(shù)etContentPane().add(textArea,BorderLayout.CENTER);//添加文本域組件到文本框setBounds(100,100,383,225);//設(shè)置窗體大小位置setDefaultCloseOperation(JFrame.EXI^ON_CLOSE);setVisible(true);//顯示窗體【補(bǔ)充代碼】//創(chuàng)建thread線程,當(dāng)前窗口做為該線程的目標(biāo)對(duì)象【補(bǔ)充代碼】//啟動(dòng)thread線程}//Runnable接口方法,是線程的執(zhí)行方法^Overridepublicvoidrun()(String[]intros=introduction.split("");//將字符串分割為數(shù)組for(Stringch:intros)(//ForEach遍歷字符串?dāng)?shù)組textArea.append(ch);//添加一個(gè)字符到文本域try(【補(bǔ)充代碼】//線程休眠0.1秒}catch(InterruptedExceptione)(e.printStackTrace();}}}publicstaticvoidmain(Stringargs[])(newRunnableDemo();//創(chuàng)建本類實(shí)例對(duì)象}}importjava.awt.BorderLayout;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JTextArea;importjavax.swing.border.BevelBorder;//importjavax.swing.plaf.SliderUI;publicclassRunnableDemoextendsJFrameimplementsRunnable(/****/privatestaticfinallongseriaLVersionUID=1L;//動(dòng)畫顯示的文本字符串privateStringintroduction="現(xiàn)在大家已經(jīng)對(duì)計(jì)算機(jī)很熟悉了,如今計(jì)算機(jī)的操作”+”系統(tǒng)可以同時(shí)執(zhí)行多個(gè)任務(wù),在聽歌的同時(shí)能夠打字、下載文件,在聊天窗口打"+"字的時(shí)候,對(duì)方同時(shí)還能通過視頻看到你;聽到你。這一切都是使用多任務(wù)實(shí)現(xiàn)"+”的,Java語言使用多線程實(shí)現(xiàn)一個(gè)程序中的多個(gè)任務(wù)同時(shí)運(yùn)行。程序員可以在程"+”序中執(zhí)行多個(gè)線程,每一個(gè)線程完成一個(gè)功能,并與其他線程并發(fā)執(zhí)行,這種機(jī)”+”制被稱為多線程。";JTextAreatextArea;//文本域組件JLabellabel;Threadthread;publicRunnableDemo()(setTitle("線程的控制");label=newJLabel("多線程簡介:");//標(biāo)簽組件getContentPane().add(label,BorderLayout.NORTH);//添加標(biāo)簽到窗體textArea=newJTextArea("\t");//初始化文本域組件textArea.setBorder(newBevelBorder(BevelBorder.LOWERED));//設(shè)置邊框textArea.setLineWrap(true);//設(shè)置自動(dòng)折行g(shù)etContentPane().add(textArea,BorderLayout.CENTER);〃添加文本域組件到文本框setBounds(100,100,383,225);//設(shè)置窗體大小位置setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);//顯示窗體Threadthread=newThread(this);//【補(bǔ)充代碼】//創(chuàng)建thread線程,當(dāng)前窗口做為該線程的目標(biāo)對(duì)象thread.start();//【補(bǔ)充代碼】//啟動(dòng)thread線程}//Runnable接口方法,是線程的執(zhí)行方法^Overridepublicvoidrun()(String[]intros=introduction.split("");//將字符串分割為數(shù)組for(Stringch:intros)(//ForEach遍歷字符串?dāng)?shù)組textArea.append(ch);//添加一個(gè)字符到文本域try(Thread.steep(100);//【補(bǔ)充代碼】//線程休眠0.1秒}catch(InterruptedExceptione)(e.printStackTrace();}}}publicstaticvoidmain(Stringargs[])(newRunnableDemo();//創(chuàng)建本類實(shí)例對(duì)象}}2)在窗體的南面添加三個(gè)按鈕,為程序添加線程控制功能,要求點(diǎn)擊開始按鈕(startBtn),線程開始啟動(dòng),文字逐個(gè)顯示,并且將按鈕狀態(tài)改變?yōu)榻?因?yàn)榫€程不能重復(fù)啟動(dòng))點(diǎn)擊暫停按鈕(pauseBtn),線程暫停,文字顯示停止;點(diǎn)擊恢復(fù)按鈕(resumeBtn),線程恢復(fù)運(yùn)行,文字繼續(xù)顯示。當(dāng)線程執(zhí)行完畢后,恢復(fù)開始按鈕的狀態(tài)為可用。程序運(yùn)行界面如下圖所示:importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjavax.swing.border.BevelBorder;publicclassRunnableDemoextendsJFrameimplementsRunnable,ActionListener(privatestaticfinallongseriaLVersionUID=1L;//動(dòng)畫顯示的文本字符串privateStringintroduction="現(xiàn)在大家已經(jīng)對(duì)計(jì)算機(jī)很熟悉了,如今計(jì)算機(jī)的操作”+”系統(tǒng)可以同時(shí)執(zhí)行多個(gè)任務(wù),在聽歌的同時(shí)能夠打字、下載文件,在聊天窗口打"+"字的時(shí)候,對(duì)方同時(shí)還能通過視頻看到你;聽到你。這一切都是使用多任務(wù)實(shí)現(xiàn)"+"的,Java語言使用多線程實(shí)現(xiàn)一個(gè)程序中的多個(gè)任務(wù)同時(shí)運(yùn)行。程序員可以在程"+”序中執(zhí)行多個(gè)線程,每一個(gè)線程完成一個(gè)功能,并與其他線程并發(fā)執(zhí)行,這種機(jī)"+”制被稱為多線程。";JTextAreatextArea;//文本域組件JLabellabel;Threadthread;JButtonstartBtn,pauseBtn,resumeBtn;booleanallow=false;publicRunnableDemo()(setTitle("線程的控制");label=newJLabel("多線程簡介:");//標(biāo)簽組件getContentPane().add(label,BorderLayout.NORTH);//添加標(biāo)簽到窗體textArea=newJTextArea("\t");//初始化文本域組件textArea.setBorder(newBevelBorder(BevelBorder.LOWERED));//設(shè)置邊框textArea.setLineWrap(true);//設(shè)置自動(dòng)折行textArea.setEditable(false);//設(shè)置不可被編輯getContentPane().add(textArea,BorderLayout.CENTER);〃添加文本域組件到文本框startBtn=newJButton("開始");pauseBtn=newJButton("暫停");resumeBtn=newJButton("恢復(fù)");startBtn.addActionListener(this);pauseBtn.addActionListener(this);resumeBtn.addActionListener(this);JPanelpanel=newJPanel();panel.add(startBtn);panel.add(pauseBtn);panel.add(resumeBtn);getContentPane().add(panel,BorderLayout.SOUTH);setBounds(100,100,383,225);//設(shè)置窗體大小位置setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);//顯示窗體//setLocationRelativeTo(null);//在屏幕中央顯示}//Runnable接口方法,是線程的執(zhí)行方法^Overridepublicvoidrun()(String[]intros=introduction.split("");//將字符串分割為數(shù)組for(Stringch:intros)(//ForEach遍歷字符串?dāng)?shù)組synchronized(this)(while(allow)(try(wait();}catch(InterruptedExceptione)(e.printStackTrace();}}}textArea.append(ch);//添加一個(gè)字符到文本域try(Thread.steep(100);//【補(bǔ)充代碼】//線程休眠0.1秒}catch(InterruptedExceptione)(e.printStackTrace();}}startBtn.setEnabled(true);}publicstaticvoidmain(Stringargs[])(newRunnableDemo();//創(chuàng)建本類實(shí)例對(duì)象}^OverridepublicvoidactionPerformed(ActionEvente)(if(e.getSource()==startBtn){textArea.setText("\t");Threadthread=newThread(this);//【補(bǔ)充代碼】〃創(chuàng)建thread線程,當(dāng)前窗口做為該線程的目標(biāo)對(duì)象thread.start();//【補(bǔ)充代碼】//啟動(dòng)thread線程startBtn.setEnabled(false);}elseif(e.getSource()==pauseBtn){allow=true;}elseif(e.getSource()==resumeBtn){allow=false;synchronized(this){notifyAll();}}}}實(shí)驗(yàn)總結(jié)請(qǐng)書寫你對(duì)本次實(shí)驗(yàn)有哪些實(shí)質(zhì)性的收獲和體會(huì),以及對(duì)本次實(shí)驗(yàn)有何良好的建議?參考文獻(xiàn):《Java2實(shí)用教程(第三版)》耿祥義、張躍平編著,清華大學(xué)出版社。《Java2實(shí)用教程(第三版)實(shí)驗(yàn)指導(dǎo)與習(xí)題解答》耿祥義、張躍平編著,清華大學(xué)出版社?!禞ava開發(fā)實(shí)戰(zhàn)寶典》,李鐘尉等編著,清華大學(xué)出版社。附錄一一JavaCode之多態(tài)通過一個(gè)簡單的例子理解多態(tài)的概念/***人民警察*/publicinterfaceIPolice(/***抓小偷*/publicvoidcatchThief();}/***一個(gè)警察,執(zhí)行抓小偷任務(wù).*/publicclassPoliceRealimplementsIPolice(publicvoidcatchThief()(Systemout.println("抓住小偷了”);}}/***另一個(gè)警察,也執(zhí)行抓小偷任務(wù).*/publicclassPoliceHypimplementsIPolice(publicvoidcatchThief()(Systemout.println("大冷天的抓什么小偷啊,不如偷個(gè)菜.”);}}/***市民*/publicclassCitizen(privateStringmName;publicCitizen(Stringname)(mName=name;}/***市民報(bào)案*/publicvoidreport(IPolicepolice)(Systemout.println(String.format("市民%s丟失手機(jī),向警察報(bào)案抓小偷.",mName));police.catchThief();}}案情:市民雖然向警察報(bào)了案,但你不知道能不能把小偷抓住,甚至你都不知道他們有沒有去抓小偷,還有可能你在電影里看到的劇情真的發(fā)生了...事情經(jīng)過可能是這樣:publicclassMain(publicstaticvoidmain(String[]args)(Citizencitizen=newCitizen("張三");IPolicepolice=getPoLice();citizen.report(police);}privatestaticIPolicegetPolice()(returnnew

溫馨提示

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

評(píng)論

0/150

提交評(píng)論