Java典型模块与项目实战大全(第8章)_IT168文库.doc_第1页
Java典型模块与项目实战大全(第8章)_IT168文库.doc_第2页
Java典型模块与项目实战大全(第8章)_IT168文库.doc_第3页
Java典型模块与项目实战大全(第8章)_IT168文库.doc_第4页
Java典型模块与项目实战大全(第8章)_IT168文库.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章 关机工具(Timer类+系统命令)第8章 关机工具(Timer类+系统命令)在Java语言中,线程的类除了类Thread外,还有类Timer和类TimerTask。因此对于程序员来说,如果想掌握好事件机制,除了掌握类Thread,还必须要学习类Timer和类TimerTask。本章将通过模拟关机工具的功能,介绍如何调用Windows系统命令,还将详细介绍线程的类Timer。本章的学习目标如下:q 掌握关机工具项目;q 掌握如何调用Windows系统命令;q 理解Timer和TimerTask类。8.1 关机工具原理关机工具项目用来模拟计算机的关机功能,即Windows系统的关机功能,除此之外还将实现定时关闭计算机的功能等。8.1.1 项目结构框架分析对于关机工具项目,除了该项目的界面外,剩下的就是两个工具类。关机工具项目项目目录如图8.1所示,该项目中的3个类分别为关机工具类CutDownTool.java、定时关机工具类CountTimeTool.java和关机工具项目界面类CloseComputer.java。图8.1 项目目录8.1.2 项目功能业务分析本节将向读者介绍整个项目要实现的功能。这些功能包括关机工具的初始化、按住鼠标功能和放开鼠标后的功能。1关机工具初始化当运行关机工具项目中的CloseComputer类后,就会出现如图8.2所示的初始界面。在该界面中将显示出实现关机的各种方式。图8.2 关机工具初始界面2倒计时关机功能关机工具项目要实现倒计时关机功能,可以在初始化对话框中单击“倒计时关机”按钮,弹出时间输入对话框。在该对话框中输入相应的时间后,单击“确定”按钮就会实现以输入框中的时间倒计时关机的功能。如果想取消该功能,可以在初始化对话框中单击“取消关机”按钮,弹出确认对话框。在该对话框中单击“确定”按钮就可以实现取消关机的功能,具体过程如图8.3所示。图8.3 倒计时关机的过程3定时关机功能关机工具项目要实现定时关机功能,可以在初始化对话框中单击“定时关机”按钮,弹出时间输入对话框。在该对话框中输入相应的时间后,单击“确定”按钮就会实现以输入框中的时间倒计时关机功能。如果想取消该功能,可以在初始化对话框中单击“取消关机”按钮,弹出确认对话框。在该对话框中单击“确定”按钮就可以实现取消关机的功能,具体过程如图8.4所示。图8.4 定时关机的过程8.2 关机工具的实现过程本章通过调用系统命令和多线程的相关知识来实现关机工具项目,具体程序架构如图8.5所示,它包含两个工具类和一个界面类。图8.5 程序关系图8.2.1 关机工具的类CloseComputer.java类用来实现“关机工具”项目的界面,所以该类继承了类JFrame,又由于该类需要实现事件机制,所以实现了接口ActionListener。该类的具体内容如代码8.1所示,UML如图8.6所示。图8.6 关机工具类图代码8.1 关机工具类:CloseComputer.javapublic class CloseComputer extends JFrame implements ActionListener /创建成员变量/创建实现BorderLayout布局的面板对象panel_mainprivate JPanel panel_main = new JPanel(new BorderLayout(5, 10);/创建实现FlowLayout布局的面板对象panel_subnorthprivate JPanel panel_subnorth = new JPanel(new FlowLayout(3);/创建实现FlowLayout布局的面板对象panel_subcenterprivate JPanel panel_subcenter = new JPanel(new FlowLayout(1, 5, 5);/创建了3个按钮对象countdown、time和cancelprivate JButton countdown = new JButton(倒计时关机);private JButton time = new JButton(定时关机);private JButton cancel = new JButton(取消关机);private JLabel tag; /创建标签对象tagString key; /创建字符串对象keypublic CloseComputer() /构造函数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个按钮注册事件监听器countdown.addActionListener(this);time.addActionListener(this);cancel.addActionListener(this);public static void main(String args) throws Exception /主方法CloseComputer frame = new CloseComputer();/创建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() /“倒计时关机”调用的方法/获取输入的信息key = JOptionPane.showInputDialog(this, 请输入倒计时关机剩余的时间(秒), 输入框, 1);CountTimeTool.delaytime(Long.parseLong(key);/调用类CountTimeTool的delaytimepublic void time() /“定时关机”调用的方法Calendar calendar = Calendar.getInstance();/获取当前系统的时间/获取当前的时、分和秒int h = calendar.get(Calendar.HOUR);int m = calendar.get(Calendar.MINUTE);int s = calendar.get(Calendar.SECOND); String a = String.valueOf(h);/转换变量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类型变量转换成int类型变量hour = Integer.parseInt(hourtmp);minute = Integer.parseInt(minutetmp);secord = Integer.parseInt(secordtmp);/通过调用timesum()方法,计算出当前系统的时间currently_time和输入的时间set_timelong set_time = timesum(hour, minute, secord);long currently_time = timesum(h, m, s);/获取设置时间与系统时间之间的差long discrepancy_time = set_time - currently_time;if (discrepancy_time 0) /当设置时间比系统时间早时try /执行关闭功能Runtime.getRuntime().exec(shutdown -s); catch (IOException e) e.printStackTrace(); else /调用类CountTimeTool的delaytime()方法CountTimeTool.delaytime(discrepancy_time);JOptionPane.showMessageDialog(this, 恭喜你,设置成功!, 确认, 2);/计算出时间总和,并返回public int timesum(int h, int m, int s) /把时和分变量分别转换成秒int sum = h * 3600 + m * 60 + s;return sum; public void cancel() /“取消关机”调用的方法try /显示信息框JOptionPane.showMessageDialog(this, 你已经成功取消了关机操作!, 消息, 2);/执行取消关闭计算机命令Runtime.getRuntime().exec(shutdown -a); catch (IOException e) public void actionPerformed(ActionEvent eAction) /事件监听事件String ActionCommand = eAction.getActionCommand();if (eAction.getSource() instanceof JButton) /发生事件的组件是JButton类型if (倒计时关机.equals(ActionCommand) /如果为“倒计时关机”按钮countdown(); /调用countdown()方法if (定时关机.equals(ActionCommand) /如果为“定时关机”按钮time(); /调用time()方法if (取消关机.equals(ActionCommand) /如果为“取消关机”按钮cancel(); /调用cancel()方法【代码解析】q 上述代码实现了关机工具项目界面,该用户界面涉及的具体容器、对象和布局如图8.7所示。q 上述代码中,语句“Runtime.getRuntime().exec(shutdown -s)”的意思就是启动一个新的进程执行shutdown -s命令。该命令的含义为关闭计算机,而命令shutdown -a的含义为取消关闭计算机。图8.7 布局8.2.2 关机工具的工具类CutDownTool.java类主要用来实现关闭计算机的功能,由于该类需要被定时调用,所以继承了TimerTask类,该类的具体内容如代码8.2所示。代码8.2 关机工具类:CutDownTool.javapublic class CutDownTool extends TimerTask /继承了TimerTask类public void run() /重写run()方法try /执行关闭计算机命令Runtime.getRuntime().exec(shutdown -s); catch (IOException e) e.printStackTrace();【代码解析】在上述代码中,首先继承了TimerTask类,然后重写该类的run()方法,在该方法中通过执行命令shutdown-s实现了关闭计算机的功能。CutDownTool.java类主要用来实现定时关闭计算机的功能,即在一定时间后执行CutDownTool类,该类的具体内容如代码8.3所示。代码8.3 定时关机工具类:CountTimeTool.javapublic class CountTimeTool public static void delaytime(long dt) long delay = 1000; /间隔变量delayTimer timer = new Timer(); /创建Timer变量CutDownTool w1 = new CutDownTool();/创建CutDownTool对象timer.schedule(w1, delay * dt); /在delay*dt时间段后执行w1【代码解析】上述代码中为了实现定时的效果,调用了类Timer的schedule()方法,表示w1被安排在delay*dt指定的时间后执行。8.3 知识点扩展关机工具项目涉及的知识在关机工具项目中,除了涉及用户界面的知识外,还通过Timer和TimerTask类实现了多线程,同时还通过调用系统命令实现了计算机关闭功能。本节除了详细介绍线程的类Timer和TimerTask外,还将详细讲解系统命令Shutdown。8.3.1 Timer和TimerTask类在Java语言中如果想实现每隔一段时间去执行某个任务,除了可以使用线程类Thread外,还可以使用包java.util中的类Timer和TimerTask。对于前者首先需要创建后台进程,然后让其每隔一段时间执行,具体实现时比较麻烦。对于后者,只需要在TimerTask类的run()方法中实现任务,然后Timer类就会安排其每隔一段时间执行,具体实现时比较简单。所谓Timer,就是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行该任务一次或反复多次。所谓TimerTask,其实质是一个抽象类,其子类代表一个可以被Timer计划的任务。下面通过一个具体的类TimerTest来讲解Timer和TimerTask类的使用,该类的具体内容如代码8.4所示。代码8.4 测试类:TimerTest.javapublic class TimerTest extends TimerTask /创建成员变量String index; /创建一个字符串变量Timer myTimer = new Timer(); /创建一个Timer对象public TimerTest(String index) /构造函数this.index = index;public void run() /重写run()方法System.out.println(index);/反复执行的任务public void start(int delay, int internal) /实现反复执行功能/在delay * 1000时间后开始执行TimerTest对象,执行后每隔internal * 1000反复执行myTimer.schedule(this, delay * 1000, internal * 1000); public void end() myTimer.cancel(); /调用cancel()方法结束public static void main(String args) /主方法/创建和设置myTask1对象TimerTest myTask1 = new TimerTest(线程1执行);myTask1.start(0, 3); /调用start()方法/创建和设置myTask2对象TimerTest myTask2 = new TimerTest(线程2执行);myTask2.start(0, 1); /调用start()方法try Thread.sleep(6000); /使线程休眠6秒 catch (InterruptedException e) /结束myTask1.end();myTask2.end();运行TimerTest.java类,其控制台窗口如图8.8所示。图8.8 运行结果【代码解析】q 在上述代码的众多方法中,由于继承了TimerTask类,所以需要重写run()方法实现业务功能;在启动线程的start()方法中,通过调用Timer类的schedule()方法执行TimerTest对象;在结束线程的end()方法中,通过调用Timer类的cancel()方法结束线程。q 在上述代码的主方法main()中,首先创建了两个线程对象myTask1和myTask2,然后通过start()方法启动线程,通过end()方法结束线程,在具体调用这两个方法之间,通过Thread.sleep()方法实现当前线程休眠一段时间。最后,通过查看API帮助文档可以发现,如果想实现执行计划、定时任务,首先需要继承TimerTask类并重写该类的run()方法来实现任务功能,然后通过调用Timer类的schedule()方法执行TimerTask类对象。详细介绍如下。1TimerTask类对于TimerTask类,其是扩展了Object并实现了Runnable接口的抽象类,因此在具体编程时,可以在public void run()方法中编写具体的执行任务。该类拥有几个重要方法,如下所示。(1)public boolean cancel()该方法用来终止计时器任务的执行运行。%注意:Timer类要求循环执行任务(TimerTask任务)时,如果该对象正在执行,则会在执行完之后不会再循环执行;如果还未执行或处于停歇期,则不会执行。(2)public abstract void run()该方法为计时器任务要执行的操作。(3)public long scheduledExecutionTime()该方法用来返回计时器任务被安排最后执行的时间,一般用来确定计时器任务的运行是否足够及时,执行是否正当。2Timer类对于Timer类,主要用来控制TimerTask类的任务执行一次或者定期重复执行,该类拥有4个构造函数,分别如下。(1)Timer()该构造函数用来创建一个默认的计时器。(2)Timer(boolean isDaemon)参数isDaemon指定线程的守护,创建一个指定守护线程的计时器。%注意:当参数isDaemon为true时,该计时器对象相关线程为后台进程线程,根据线程知识可以知道,如果应用程序中还有程序继续运行,后台线程进程就不会停止 执行。(3)Timer(String name)参数name为线程的名字,用来创建一个指定名称的相关线程的计时器。(4)Timer(String name, boolean isDaemon)该函数用来创建一个新计时器,不仅指定相关线程的名称,而且还指定其为后台线程。在具体创建计时器对象时,不推荐使用Timer timer = new Timer(true)语句。因为这种方式创建的计时器对象,在应用程序结束后会自动结束,非常不利于使用。除了构造函数外,该Timer类还拥有其他几个重要方法,其中最重要的方法就是各种重载的schedule()方法和scheduleAtFixedRate()方法,分别如下:(1)public void schedule(TimerTask task,Date time)参数task为所计时器任务对象,参数time为Data类型对象,该方法用来实现在指定的时间后执行计时器任务。%注意:如果参数time为过去时,则任务task对象会立刻执行。(2)public void schedule(TimerTask task, long delay)参数delay为long类型,该方法用来实现在指定的时间(毫秒)后执行计时器任务。(3)public void schedule(TimerTask task, Date firstTime, long period)参数firstTime为Date类型,表示第一次执行的时间;参数period为long类型,表示间隔的时间(毫秒);该方法用来在firstTime时间后执行任务task,同时在第一次执行后每隔period(毫秒)反复执行。每一次重复的间隔时间会因为前一次task的执行时间受到影响。(4)public void schedule(TimerTask task,long delay, long period)参数delay为long类型,该方法用来在firstTime时间(毫秒)后执行任务task,同时在第一次执行后每隔period(毫秒)反复执行。每一次重复的间隔时间会因为前一次task的执行时间受到影响。%注意:当表示时间的参数为long类型时,表示毫秒。由于long类型的时间并不能保证与时钟准确同步,所以拥有long类型的时间参数适合短期的保持频率。(5)public void scheduleAtFixedRate(TimerTask task,Date firstTime, long period)参数firstTime为Date类型,该方法用来在firstTime时间后执行任务task,同时在第一次执行后每隔period(毫秒)反复执行。每一次重复的间隔时间不会因为前一次task的执行时间受到影响。(6)public void scheduleAtFixedRate(TimerTask task,long delay,long period)参数firstTime为long类型,该方法用来在delay时间后执行任务task,同时在第一次执行后每隔period(毫秒)反复执行。每一次重复的间隔时间不会因为前一次task的执行时间受到影响。当需要反复执行的任务时,如果注重任务执行的平滑度,那么需要使用schedule()方法,如果注重任务执行的频度,那么需要使用scheduleAtFixedRate()方法。例如,当使用schedule()方法时,意味着所有计时器任务之间的时间间隔至少为1秒,即如果有一个计时器任务因为某种原因迟到了(未按计划执行),那么余下的所有计时器任务都要延时执行。当使用scheduleAtFixedRate()方法时,如果有一个计时器任务因为某种原因迟到了(未按计划执行),那么后面余下的所有计时器任务还会以固定的间隔时间执行。即schedule()方法会实现固定延迟执行功能,而scheduleAtFixedRate()方法会实现固定速率执行功能。最后还存在一个关闭Timer类的对象方法,如下所示。public void cancel()该方法用来终止Timer的功能执行。%注意:当执行该方法后,虽然不会对正在执行的任务有影响,但是却不会再分配其他 任务。8.3.2 shutdown命令在Windows系统中,shutdown命令能够实现关闭或重新启动一台本地或远程计算机的功能。本节不仅讲解了shutdown命令,而且还讲解了实现该命令的程序shutdown.exe。对于shutdown命令,其具体语法如下:shutdown /i | /l | /s | /r | /a | /p | /h | /e /f /m /ComputerName /t XXX /d p:XX:YY/cComment上述语法中各个参数的含义如表8.1所示。表8.1 参数含义命 令 参 数含 义/i显示“远程关机对话框”/l立即注销当前用户/s关闭计算机/r关机后重新启动计算机/a取消关机操作/p仅关闭本地计算机(而不是远程计算机),没有超时期或警告/h使本地计算机处于休眠状态(如果已启用休眠)/e强制关闭正在运行的应用程序而不提前警告用户/f强制关闭正在运行的应用程序而不提前警告用户/m /ComputerName指定目标计算机/t XXX将重新启动或关机前超时期限或延迟设置为XXX秒/d p:XX:YY列出系统重新启动、关机或关闭电源的原因/cComment对关机原因做出详细注释%注意:在具体使用shutdown命令时,用户必须是Administrators组的成员才能对本地或远程管理计算机的意外关机进行批注。在Windows XP系统中存在一个名为shutdown.exe的程序,该程序的具体目录如图8.9所示,当在运行shutdown命令时,其实就是执行该程序。图8.9 文件目录下面介绍shutdown命令的几个具体实例。(1)如果想让计算机在23:00关机,可以在运行对话框中输入如下命令:at 23:00 shutdown s当执行上述命令后,只要到了23点,计算机就会出现“系统关机”对话框,默认有30秒钟的倒计时来提示保存工作。(2)如果想在1小时后自动关闭计算机,即实现倒计时关闭功能,可以在运行对话框中输入如下命令: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命令实现网络远程关机平时经常会遇到这种情况,公司下班后常有很多员工不关电脑,领导发现后要求解决这个问题。假如你是网管该如何办呢?有些网管会到每个办公

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论