Java典型模塊與項目實戰(zhàn)大全(第8章)_IT168文庫.doc_第1頁
Java典型模塊與項目實戰(zhàn)大全(第8章)_IT168文庫.doc_第2頁
Java典型模塊與項目實戰(zhàn)大全(第8章)_IT168文庫.doc_第3頁
Java典型模塊與項目實戰(zhàn)大全(第8章)_IT168文庫.doc_第4頁
Java典型模塊與項目實戰(zhàn)大全(第8章)_IT168文庫.doc_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第8章 關機工具(Timer類+系統(tǒng)命令)第8章 關機工具(Timer類+系統(tǒng)命令)在Java語言中,線程的類除了類Thread外,還有類Timer和類TimerTask。因此對于程序員來說,如果想掌握好事件機制,除了掌握類Thread,還必須要學習類Timer和類TimerTask。本章將通過模擬關機工具的功能,介紹如何調(diào)用Windows系統(tǒng)命令,還將詳細介紹線程的類Timer。本章的學習目標如下:q 掌握關機工具項目;q 掌握如何調(diào)用Windows系統(tǒng)命令;q 理解Timer和TimerTask類。8.1 關機工具原理關機工具項目用來模擬計算機的關機功能,即Windows系統(tǒng)的關機功能,除此之外還將實現(xiàn)定時關閉計算機的功能等。8.1.1 項目結(jié)構(gòu)框架分析對于關機工具項目,除了該項目的界面外,剩下的就是兩個工具類。關機工具項目項目目錄如圖8.1所示,該項目中的3個類分別為關機工具類CutDownTool.java、定時關機工具類CountTimeTool.java和關機工具項目界面類CloseComputer.java。圖8.1 項目目錄8.1.2 項目功能業(yè)務分析本節(jié)將向讀者介紹整個項目要實現(xiàn)的功能。這些功能包括關機工具的初始化、按住鼠標功能和放開鼠標后的功能。1關機工具初始化當運行關機工具項目中的CloseComputer類后,就會出現(xiàn)如圖8.2所示的初始界面。在該界面中將顯示出實現(xiàn)關機的各種方式。圖8.2 關機工具初始界面2倒計時關機功能關機工具項目要實現(xiàn)倒計時關機功能,可以在初始化對話框中單擊“倒計時關機”按鈕,彈出時間輸入對話框。在該對話框中輸入相應的時間后,單擊“確定”按鈕就會實現(xiàn)以輸入框中的時間倒計時關機的功能。如果想取消該功能,可以在初始化對話框中單擊“取消關機”按鈕,彈出確認對話框。在該對話框中單擊“確定”按鈕就可以實現(xiàn)取消關機的功能,具體過程如圖8.3所示。圖8.3 倒計時關機的過程3定時關機功能關機工具項目要實現(xiàn)定時關機功能,可以在初始化對話框中單擊“定時關機”按鈕,彈出時間輸入對話框。在該對話框中輸入相應的時間后,單擊“確定”按鈕就會實現(xiàn)以輸入框中的時間倒計時關機功能。如果想取消該功能,可以在初始化對話框中單擊“取消關機”按鈕,彈出確認對話框。在該對話框中單擊“確定”按鈕就可以實現(xiàn)取消關機的功能,具體過程如圖8.4所示。圖8.4 定時關機的過程8.2 關機工具的實現(xiàn)過程本章通過調(diào)用系統(tǒng)命令和多線程的相關知識來實現(xiàn)關機工具項目,具體程序架構(gòu)如圖8.5所示,它包含兩個工具類和一個界面類。圖8.5 程序關系圖8.2.1 關機工具的類CloseComputer.java類用來實現(xiàn)“關機工具”項目的界面,所以該類繼承了類JFrame,又由于該類需要實現(xiàn)事件機制,所以實現(xiàn)了接口ActionListener。該類的具體內(nèi)容如代碼8.1所示,UML如圖8.6所示。圖8.6 關機工具類圖代碼8.1 關機工具類:CloseComputer.javapublic class CloseComputer extends JFrame implements ActionListener /創(chuàng)建成員變量/創(chuàng)建實現(xiàn)BorderLayout布局的面板對象panel_mainprivate JPanel panel_main = new JPanel(new BorderLayout(5, 10);/創(chuàng)建實現(xiàn)FlowLayout布局的面板對象panel_subnorthprivate JPanel panel_subnorth = new JPanel(new FlowLayout(3);/創(chuàng)建實現(xiàn)FlowLayout布局的面板對象panel_subcenterprivate JPanel panel_subcenter = new JPanel(new FlowLayout(1, 5, 5);/創(chuàng)建了3個按鈕對象countdown、time和cancelprivate JButton countdown = new JButton(倒計時關機);private JButton time = new JButton(定時關機);private JButton cancel = new JButton(取消關機);private JLabel tag; /創(chuàng)建標簽對象tagString key; /創(chuàng)建字符串對象keypublic CloseComputer() /構(gòu)造函數(shù)this.getContentPane().add(panel_main);/添加對象panel_main到主窗口里/添加對象panel_subnorth 到對象panel_main窗口里panel_main.add(panel_subnorth, BorderLayout.NORTH);/添加對象panel_subcenter到對象panel_main窗口里panel_main.add(panel_subcenter, BorderLayout.CENTER);/添加標簽對象tag到對象panel_subnorth里panel_subnorth.add(tag = new JLabel(請選擇關機方式:);/添加3個按鈕到對象panel_subcenter里panel_subcenter.add(countdown);panel_subcenter.add(time);panel_subcenter.add(cancel);/為3個按鈕注冊事件監(jiān)聽器countdown.addActionListener(this);time.addActionListener(this);cancel.addActionListener(this);public static void main(String args) throws Exception /主方法CloseComputer frame = new CloseComputer();/創(chuàng)建CloseComputer對象/設置窗口關閉功能frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.pack();frame.setSize(320, 120); /設置窗口的大小frame.setTitle(關機工具); /設置標題frame.setLocation(350, 350);/設置顯示frame.setVisible(true);frame.setResizable(false);public void countdown() /“倒計時關機”調(diào)用的方法/獲取輸入的信息key = JOptionPane.showInputDialog(this, 請輸入倒計時關機剩余的時間(秒), 輸入框, 1);CountTimeTool.delaytime(Long.parseLong(key);/調(diào)用類CountTimeTool的delaytimepublic void time() /“定時關機”調(diào)用的方法Calendar calendar = Calendar.getInstance();/獲取當前系統(tǒng)的時間/獲取當前的時、分和秒int h = calendar.get(Calendar.HOUR);int m = calendar.get(Calendar.MINUTE);int s = calendar.get(Calendar.SECOND); String a = String.valueOf(h);/轉(zhuǎn)換變量h為字符串int hour, minute, secord; /定義輸入的時、分和秒int類型變量String hourtmp, minutetmp, secordtmp;/定義輸入的時、分和秒string類型變量/為變量hourtmp, minutetmp, secordtmp賦值hourtmp = JOptionPane.showInputDialog(this, 請輸入關機的小時(12小時制), 輸入, 1);minutetmp = JOptionPane.showInputDialog(this, 請輸入關機的分鐘, 輸入, 1);secordtmp = JOptionPane.showInputDialog(this, 請輸入關機的秒鐘, 輸入, 1);/把Sting類型變量轉(zhuǎn)換成int類型變量hour = Integer.parseInt(hourtmp);minute = Integer.parseInt(minutetmp);secord = Integer.parseInt(secordtmp);/通過調(diào)用timesum()方法,計算出當前系統(tǒng)的時間currently_time和輸入的時間set_timelong set_time = timesum(hour, minute, secord);long currently_time = timesum(h, m, s);/獲取設置時間與系統(tǒng)時間之間的差long discrepancy_time = set_time - currently_time;if (discrepancy_time 0) /當設置時間比系統(tǒng)時間早時try /執(zhí)行關閉功能Runtime.getRuntime().exec(shutdown -s); catch (IOException e) e.printStackTrace(); else /調(diào)用類CountTimeTool的delaytime()方法CountTimeTool.delaytime(discrepancy_time);JOptionPane.showMessageDialog(this, 恭喜你,設置成功!, 確認, 2);/計算出時間總和,并返回public int timesum(int h, int m, int s) /把時和分變量分別轉(zhuǎn)換成秒int sum = h * 3600 + m * 60 + s;return sum; public void cancel() /“取消關機”調(diào)用的方法try /顯示信息框JOptionPane.showMessageDialog(this, 你已經(jīng)成功取消了關機操作!, 消息, 2);/執(zhí)行取消關閉計算機命令Runtime.getRuntime().exec(shutdown -a); catch (IOException e) public void actionPerformed(ActionEvent eAction) /事件監(jiān)聽事件String ActionCommand = eAction.getActionCommand();if (eAction.getSource() instanceof JButton) /發(fā)生事件的組件是JButton類型if (倒計時關機.equals(ActionCommand) /如果為“倒計時關機”按鈕countdown(); /調(diào)用countdown()方法if (定時關機.equals(ActionCommand) /如果為“定時關機”按鈕time(); /調(diào)用time()方法if (取消關機.equals(ActionCommand) /如果為“取消關機”按鈕cancel(); /調(diào)用cancel()方法【代碼解析】q 上述代碼實現(xiàn)了關機工具項目界面,該用戶界面涉及的具體容器、對象和布局如圖8.7所示。q 上述代碼中,語句“Runtime.getRuntime().exec(shutdown -s)”的意思就是啟動一個新的進程執(zhí)行shutdown -s命令。該命令的含義為關閉計算機,而命令shutdown -a的含義為取消關閉計算機。圖8.7 布局8.2.2 關機工具的工具類CutDownTool.java類主要用來實現(xiàn)關閉計算機的功能,由于該類需要被定時調(diào)用,所以繼承了TimerTask類,該類的具體內(nèi)容如代碼8.2所示。代碼8.2 關機工具類:CutDownTool.javapublic class CutDownTool extends TimerTask /繼承了TimerTask類public void run() /重寫run()方法try /執(zhí)行關閉計算機命令Runtime.getRuntime().exec(shutdown -s); catch (IOException e) e.printStackTrace();【代碼解析】在上述代碼中,首先繼承了TimerTask類,然后重寫該類的run()方法,在該方法中通過執(zhí)行命令shutdown-s實現(xiàn)了關閉計算機的功能。CutDownTool.java類主要用來實現(xiàn)定時關閉計算機的功能,即在一定時間后執(zhí)行CutDownTool類,該類的具體內(nèi)容如代碼8.3所示。代碼8.3 定時關機工具類:CountTimeTool.javapublic class CountTimeTool public static void delaytime(long dt) long delay = 1000; /間隔變量delayTimer timer = new Timer(); /創(chuàng)建Timer變量CutDownTool w1 = new CutDownTool();/創(chuàng)建CutDownTool對象timer.schedule(w1, delay * dt); /在delay*dt時間段后執(zhí)行w1【代碼解析】上述代碼中為了實現(xiàn)定時的效果,調(diào)用了類Timer的schedule()方法,表示w1被安排在delay*dt指定的時間后執(zhí)行。8.3 知識點擴展關機工具項目涉及的知識在關機工具項目中,除了涉及用戶界面的知識外,還通過Timer和TimerTask類實現(xiàn)了多線程,同時還通過調(diào)用系統(tǒng)命令實現(xiàn)了計算機關閉功能。本節(jié)除了詳細介紹線程的類Timer和TimerTask外,還將詳細講解系統(tǒng)命令Shutdown。8.3.1 Timer和TimerTask類在Java語言中如果想實現(xiàn)每隔一段時間去執(zhí)行某個任務,除了可以使用線程類Thread外,還可以使用包java.util中的類Timer和TimerTask。對于前者首先需要創(chuàng)建后臺進程,然后讓其每隔一段時間執(zhí)行,具體實現(xiàn)時比較麻煩。對于后者,只需要在TimerTask類的run()方法中實現(xiàn)任務,然后Timer類就會安排其每隔一段時間執(zhí)行,具體實現(xiàn)時比較簡單。所謂Timer,就是一種定時器工具,用來在一個后臺線程計劃執(zhí)行指定任務。它可以計劃執(zhí)行該任務一次或反復多次。所謂TimerTask,其實質(zhì)是一個抽象類,其子類代表一個可以被Timer計劃的任務。下面通過一個具體的類TimerTest來講解Timer和TimerTask類的使用,該類的具體內(nèi)容如代碼8.4所示。代碼8.4 測試類:TimerTest.javapublic class TimerTest extends TimerTask /創(chuàng)建成員變量String index; /創(chuàng)建一個字符串變量Timer myTimer = new Timer(); /創(chuàng)建一個Timer對象public TimerTest(String index) /構(gòu)造函數(shù)this.index = index;public void run() /重寫run()方法System.out.println(index);/反復執(zhí)行的任務public void start(int delay, int internal) /實現(xiàn)反復執(zhí)行功能/在delay * 1000時間后開始執(zhí)行TimerTest對象,執(zhí)行后每隔internal * 1000反復執(zhí)行myTimer.schedule(this, delay * 1000, internal * 1000); public void end() myTimer.cancel(); /調(diào)用cancel()方法結(jié)束public static void main(String args) /主方法/創(chuàng)建和設置myTask1對象TimerTest myTask1 = new TimerTest(線程1執(zhí)行);myTask1.start(0, 3); /調(diào)用start()方法/創(chuàng)建和設置myTask2對象TimerTest myTask2 = new TimerTest(線程2執(zhí)行);myTask2.start(0, 1); /調(diào)用start()方法try Thread.sleep(6000); /使線程休眠6秒 catch (InterruptedException e) /結(jié)束myTask1.end();myTask2.end();運行TimerTest.java類,其控制臺窗口如圖8.8所示。圖8.8 運行結(jié)果【代碼解析】q 在上述代碼的眾多方法中,由于繼承了TimerTask類,所以需要重寫run()方法實現(xiàn)業(yè)務功能;在啟動線程的start()方法中,通過調(diào)用Timer類的schedule()方法執(zhí)行TimerTest對象;在結(jié)束線程的end()方法中,通過調(diào)用Timer類的cancel()方法結(jié)束線程。q 在上述代碼的主方法main()中,首先創(chuàng)建了兩個線程對象myTask1和myTask2,然后通過start()方法啟動線程,通過end()方法結(jié)束線程,在具體調(diào)用這兩個方法之間,通過Thread.sleep()方法實現(xiàn)當前線程休眠一段時間。最后,通過查看API幫助文檔可以發(fā)現(xiàn),如果想實現(xiàn)執(zhí)行計劃、定時任務,首先需要繼承TimerTask類并重寫該類的run()方法來實現(xiàn)任務功能,然后通過調(diào)用Timer類的schedule()方法執(zhí)行TimerTask類對象。詳細介紹如下。1TimerTask類對于TimerTask類,其是擴展了Object并實現(xiàn)了Runnable接口的抽象類,因此在具體編程時,可以在public void run()方法中編寫具體的執(zhí)行任務。該類擁有幾個重要方法,如下所示。(1)public boolean cancel()該方法用來終止計時器任務的執(zhí)行運行。%注意:Timer類要求循環(huán)執(zhí)行任務(TimerTask任務)時,如果該對象正在執(zhí)行,則會在執(zhí)行完之后不會再循環(huán)執(zhí)行;如果還未執(zhí)行或處于停歇期,則不會執(zhí)行。(2)public abstract void run()該方法為計時器任務要執(zhí)行的操作。(3)public long scheduledExecutionTime()該方法用來返回計時器任務被安排最后執(zhí)行的時間,一般用來確定計時器任務的運行是否足夠及時,執(zhí)行是否正當。2Timer類對于Timer類,主要用來控制TimerTask類的任務執(zhí)行一次或者定期重復執(zhí)行,該類擁有4個構(gòu)造函數(shù),分別如下。(1)Timer()該構(gòu)造函數(shù)用來創(chuàng)建一個默認的計時器。(2)Timer(boolean isDaemon)參數(shù)isDaemon指定線程的守護,創(chuàng)建一個指定守護線程的計時器。%注意:當參數(shù)isDaemon為true時,該計時器對象相關線程為后臺進程線程,根據(jù)線程知識可以知道,如果應用程序中還有程序繼續(xù)運行,后臺線程進程就不會停止 執(zhí)行。(3)Timer(String name)參數(shù)name為線程的名字,用來創(chuàng)建一個指定名稱的相關線程的計時器。(4)Timer(String name, boolean isDaemon)該函數(shù)用來創(chuàng)建一個新計時器,不僅指定相關線程的名稱,而且還指定其為后臺線程。在具體創(chuàng)建計時器對象時,不推薦使用Timer timer = new Timer(true)語句。因為這種方式創(chuàng)建的計時器對象,在應用程序結(jié)束后會自動結(jié)束,非常不利于使用。除了構(gòu)造函數(shù)外,該Timer類還擁有其他幾個重要方法,其中最重要的方法就是各種重載的schedule()方法和scheduleAtFixedRate()方法,分別如下:(1)public void schedule(TimerTask task,Date time)參數(shù)task為所計時器任務對象,參數(shù)time為Data類型對象,該方法用來實現(xiàn)在指定的時間后執(zhí)行計時器任務。%注意:如果參數(shù)time為過去時,則任務task對象會立刻執(zhí)行。(2)public void schedule(TimerTask task, long delay)參數(shù)delay為long類型,該方法用來實現(xiàn)在指定的時間(毫秒)后執(zhí)行計時器任務。(3)public void schedule(TimerTask task, Date firstTime, long period)參數(shù)firstTime為Date類型,表示第一次執(zhí)行的時間;參數(shù)period為long類型,表示間隔的時間(毫秒);該方法用來在firstTime時間后執(zhí)行任務task,同時在第一次執(zhí)行后每隔period(毫秒)反復執(zhí)行。每一次重復的間隔時間會因為前一次task的執(zhí)行時間受到影響。(4)public void schedule(TimerTask task,long delay, long period)參數(shù)delay為long類型,該方法用來在firstTime時間(毫秒)后執(zhí)行任務task,同時在第一次執(zhí)行后每隔period(毫秒)反復執(zhí)行。每一次重復的間隔時間會因為前一次task的執(zhí)行時間受到影響。%注意:當表示時間的參數(shù)為long類型時,表示毫秒。由于long類型的時間并不能保證與時鐘準確同步,所以擁有l(wèi)ong類型的時間參數(shù)適合短期的保持頻率。(5)public void scheduleAtFixedRate(TimerTask task,Date firstTime, long period)參數(shù)firstTime為Date類型,該方法用來在firstTime時間后執(zhí)行任務task,同時在第一次執(zhí)行后每隔period(毫秒)反復執(zhí)行。每一次重復的間隔時間不會因為前一次task的執(zhí)行時間受到影響。(6)public void scheduleAtFixedRate(TimerTask task,long delay,long period)參數(shù)firstTime為long類型,該方法用來在delay時間后執(zhí)行任務task,同時在第一次執(zhí)行后每隔period(毫秒)反復執(zhí)行。每一次重復的間隔時間不會因為前一次task的執(zhí)行時間受到影響。當需要反復執(zhí)行的任務時,如果注重任務執(zhí)行的平滑度,那么需要使用schedule()方法,如果注重任務執(zhí)行的頻度,那么需要使用scheduleAtFixedRate()方法。例如,當使用schedule()方法時,意味著所有計時器任務之間的時間間隔至少為1秒,即如果有一個計時器任務因為某種原因遲到了(未按計劃執(zhí)行),那么余下的所有計時器任務都要延時執(zhí)行。當使用scheduleAtFixedRate()方法時,如果有一個計時器任務因為某種原因遲到了(未按計劃執(zhí)行),那么后面余下的所有計時器任務還會以固定的間隔時間執(zhí)行。即schedule()方法會實現(xiàn)固定延遲執(zhí)行功能,而scheduleAtFixedRate()方法會實現(xiàn)固定速率執(zhí)行功能。最后還存在一個關閉Timer類的對象方法,如下所示。public void cancel()該方法用來終止Timer的功能執(zhí)行。%注意:當執(zhí)行該方法后,雖然不會對正在執(zhí)行的任務有影響,但是卻不會再分配其他 任務。8.3.2 shutdown命令在Windows系統(tǒng)中,shutdown命令能夠?qū)崿F(xiàn)關閉或重新啟動一臺本地或遠程計算機的功能。本節(jié)不僅講解了shutdown命令,而且還講解了實現(xiàn)該命令的程序shutdown.exe。對于shutdown命令,其具體語法如下:shutdown /i | /l | /s | /r | /a | /p | /h | /e /f /m /ComputerName /t XXX /d p:XX:YY/cComment上述語法中各個參數(shù)的含義如表8.1所示。表8.1 參數(shù)含義命 令 參 數(shù)含 義/i顯示“遠程關機對話框”/l立即注銷當前用戶/s關閉計算機/r關機后重新啟動計算機/a取消關機操作/p僅關閉本地計算機(而不是遠程計算機),沒有超時期或警告/h使本地計算機處于休眠狀態(tài)(如果已啟用休眠)/e強制關閉正在運行的應用程序而不提前警告用戶/f強制關閉正在運行的應用程序而不提前警告用戶/m /ComputerName指定目標計算機/t XXX將重新啟動或關機前超時期限或延遲設置為XXX秒/d p:XX:YY列出系統(tǒng)重新啟動、關機或關閉電源的原因/cComment對關機原因做出詳細注釋%注意:在具體使用shutdown命令時,用戶必須是Administrators組的成員才能對本地或遠程管理計算機的意外關機進行批注。在Windows XP系統(tǒng)中存在一個名為shutdown.exe的程序,該程序的具體目錄如圖8.9所示,當在運行shutdown命令時,其實就是執(zhí)行該程序。圖8.9 文件目錄下面介紹shutdown命令的幾個具體實例。(1)如果想讓計算機在23:00關機,可以在運行對話框中輸入如下命令:at 23:00 shutdown s當執(zhí)行上述命令后,只要到了23點,計算機就會出現(xiàn)“系統(tǒng)關機”對話框,默認有30秒鐘的倒計時來提示保存工作。(2)如果想在1小時后自動關閉計算機,即實現(xiàn)倒計時關閉功能,可以在運行對話框中輸入如下命令:shutdown s t 3600之所以為3600,是因為一分鐘為60秒,而1小時共3600秒。(3)如果在倒計時自動關機過程中想取消倒計時自動關機,可以在運行對話框中輸入如下命令:shutdown a(4)如果想打開“遠程關機對話框”,如圖8.10所示,對自動關機進行設置,可以在運行對話框中輸入如下命令:圖8.10 遠程關機對話框shutdown -i(5)如果想顯示shutdown命令的幫助信息,如圖8.11和圖8.12所示,可以在運行對話框中輸入如下命令:shutdown或shutdown /? 圖8.11 顯示幫助信息 圖8.12 顯示幫助信息8.3.3 通過shutdown命令實現(xiàn)網(wǎng)絡遠程關機平時經(jīng)常會遇到這種情況,公司下班后常有很多員工不關電腦,領導發(fā)現(xiàn)后要求解決這個問題。假如你是網(wǎng)管該如何辦呢?有些網(wǎng)管會到每個辦公

溫馨提示

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

評論

0/150

提交評論