java实现电脑定时关机的方法

本文实例讲述了java如何注册成windows服务程序及一个简单的java定时关机程序代码,分享给大家供大家参考。具体方法如下:

一、问题:

最近想找个软件来控制电脑的关机时间,在网上找了几个,都是可视化界面的可以设置具体的关机时间的软件。由于我想编写的关机程序是运行在别人机器上,只能让该机器在晚上17 点到23 点25 分才上网,到了23 点25 分就可以自动关机。为了让别人感觉不到这个软件的“存在”(免得使用者自己关闭定时关机软件),所以我想把关机软件注册为服务的方式,运行在后台。这里介绍下如何利用javaService 软件把java 程序注册为windows 服务。

二、实现方法:

1. 利用javaService 注册java 程序为windows 服务

① 下载javaService
访问网址http://javaservice.objectweb.org/ 下载windows 版本的javaService 文件,我下载的是JavaService-2.0.10.rar ,目前最新的版本就是“2.0.10 ”。

② 安装javaService
解压我们下载下来的javaServices 到一个目录,我是解压到目录“D:/software/JavaService-2.0.10 ”下(解压到任何目录都可以,最好别解压到中文目录,省的出现问题 )

③ 编写定时关机代码
1)   类的名字为:
com.test.timer.TimerShutDownWindows
2)   把编写后的java 文件导出为class 的形式,把导出的类放到目录“D:/software/JavaService-2.0.10/classes/com/test/timer ”下。也就是把导出的com 包放到
“D:/software/JavaService-2.0.10/classes” 目录下。

④ 注册java 程序为windows 服务
进入“D:/software/JavaService-2.0.10 “目录,执行如下命令:

复制代码 代码如下:

JavaService.exe -install MyShutDownService "%JAVA_HOME%"/jre/bin/server/jvm.dll -Djava.class.path="%JAVA_HOME%"/lib/tools.jar;D:/software/JavaService-2.0.10/classes -start com.test.timer.TimerShutDownWindows

其中“-install “后面的参数为服务的名称,“-start ”参数后边是要启动的类名,“Djava.class.path ”后面参数中的
“D:/software/JavaService-2.0.10/classe ”地址是我的“TimerShutDownWindows ”类存放的路径,实际应用中修改为自己的classPath 即可。

这里需要注意几点:

1)   “%JAVA_HOME% ”jdk 目录,如果没有配置jdk 目录,则替换为jdk 的实际绝对地址。

2)   -Djava.class.path 是必须的,因为服务启动的时候无法访问系统的CLASSPATH 变量,所以必须在这里声明;如果jar 比较多,为避免写的命令过长,我们可以使用“-Djava.ext.dirs=jars 所在目录”参数。

3)   服务添加之后,可以在命令行中敲入“services.msc ”命令来查看所有服务,并可以对服务的启动类型(自动启动还是手动启动等)进行修改。

⑤ 测试

1)  启动服务

当我们注册完服务后,我们可以通过命令“net start MyShutDownService ”来启动该服务,服务启动后会在D 盘根目录生成my_shutdown.log 日志文件。

2)  关闭服务

如果我们要关闭服务,可以通过命令“net stop MyShutDownService ”来关闭该服务。

3)  删除服务

当我们想删除该服务时,可以使用命令“sc delete MyShutDownService ”来删除该服务。

2. 定时关机代码


复制代码 代码如下:

package com.test.timer;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class TimerShutDownWindows {
    /* 检测是否需要关机的时间间隔 */
    private static long m_nDetectInterval = 5000;
    /* 记录上次检测的时间,以毫秒为单位 */
    private static long m_lLastMilliSeconds = 0;
    /* 可以使用电脑的最小小时 */
    private static int m_nUsePCMinHour = 17;
    /* 可以使用电脑的最大小时 */
    private static int m_nUseComputerMaxHour = 23;
    /* 如果分钟超过这个时间,则关机计算机 */
    private static int m_nMinutes = 25;
    /* 记录日志的文件的保存位置 */
    private static String m_sLogFile = "D:" + File.separator
           + "my_shutdown.log";
    /* 记录当前系统是否已经启动自动关闭程序 */
    private static boolean bHasShutDownPC = false;
    /**
      * @param args
      */
    public static void main(String[] args) {
       // 1. 单独开启一个线程去检测
       Thread aThread = new Thread(new TimerDetector());
       aThread.start();
    }
    /**
      * 定义内部类
      *
      * @author Administrator
      *
      */
    static class TimerDetector implements Runnable {
       /*
         * (non-Javadoc)
         *
         * @see java.lang.Runnable#run()
         */
       public void run() {
           // 1. 获取日志文件
           PrintWriter out = null;
           SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
           try {
              out = new PrintWriter(new FileWriter(m_sLogFile, true), true);
           } catch (IOException e1) {
              out = null;
              e1.printStackTrace();
           }
           // 2. 记录服务启动时间
           appendLog(out, " 服务启动时间:" + df.format(new Date()));
           while (true) {
              // 1. 判断当前系统时间是否被修改过
              boolean bShoudShutDownPC = validateShoudShutDownPC(out);
              if (bShoudShutDownPC) {
                  // 验证没通过,强制关机
                  exectueShutDown(out);
              } else {
                  bHasShutDownPC = false;
              }
              // 2. 当前线程休眠下
              try {
                  Thread.sleep(m_nDetectInterval);
              } catch (InterruptedException e) {
                  appendLog(out, e.getMessage());
              }
           }
       }
       /**
         * 验证当前时间是否是需要关机的时间
         *
         * @return
         */
       private boolean validateShoudShutDownPC(PrintWriter _out) {
           // 1. 判断是否修改了系统时间
           boolean bHasModifySystemTime = detectModifySytemTime(_out);
           appendLog(_out, "bHasModifySystemTime :" + bHasModifySystemTime);
           if (bHasModifySystemTime) {
              return bHasModifySystemTime;
           }
           // 2. 没有修改系统时间,则判断当前时间是否超过了指定的时间
           boolean bShoudSleep = nowIsSleepTime();
           appendLog(_out, "bShoudSleep :" + bShoudSleep);
           if (bShoudSleep) {
              return bShoudSleep;
           }
           return false;
       }
       /**
         * 判断当前时间是否应该休息的时间
         *
         * @return
         */
       private boolean nowIsSleepTime() {
           // 1. 获取当前小时和分钟
           Calendar aCalendar = Calendar.getInstance();
           int nHour = aCalendar.get(Calendar.HOUR_OF_DAY);
           int nMinute = aCalendar.get(Calendar.MINUTE);
           // 2. 判断当前小时是否在可以使用PC 的时间内, 最大小时为23
           if (nHour < m_nUsePCMinHour) {
              return true;
           }
           // 23 点需要单独判断,超过23 点30 就应该休息
           if ((nHour >= m_nUseComputerMaxHour) && (nMinute >= m_nMinutes)) {
              return true;
           }
           // 3. 非休息时间
           return false;
       }
       /**
         * 判断是否有人修改了系统时间,如果有人修改了系统时间返回true ,<BR>
         * 否则返回false
         *
         * @return
         */
       private boolean detectModifySytemTime(PrintWriter _out) {
           // 1. 第一次检测系统时间
           if (m_lLastMilliSeconds == 0) {
              m_lLastMilliSeconds = System.currentTimeMillis();
              return false;
           }
           // 2. 检测两次时间的差值
           long lInteral = System.currentTimeMillis() - m_lLastMilliSeconds;
           lInteral = Math.abs(lInteral);
           // 3. 判断两次的时间间隔, 两次结果不一定完全等于 m_nDetectInterval ,允许误差为1 分钟
           long lMaxInterval = m_nDetectInterval + 60 * 1000;
           appendLog(_out, "lInteral :::" + lInteral);
           appendLog(_out, "lMaxInterval :::" + lMaxInterval);
           if (lInteral > lMaxInterval) {
              // 有人修改了系统时间,强制关机
              return true;
           }
           // 4. 只有没人修改时间才记录上次检测时间
           m_lLastMilliSeconds = System.currentTimeMillis();
           return false;
       }
       /**
         * 在指定的流中写入日志信息
         *
         * @param _outWriter
         * @param _sAppendContent
         */
       private void appendLog(PrintWriter _outWriter, String _sAppendContent) {
           if (_outWriter == null) {
              return;
           }
           _outWriter.println(_sAppendContent);
       }
       /**
         * 执行关机命令
         */
       private void exectueShutDown(PrintWriter _out) {
           if (bHasShutDownPC) {
              SimpleDateFormat df = new SimpleDateFormat(
                     "yyyy-MM-dd HH:mm:ss");
              appendLog(_out, " 系统即将关闭, 当前时间:" + df.format(new Date()));
              return;
           }
           appendLog(_out, " 有人修改了系统时间,系统强制关机!");
           // 关机
           try {
              Runtime.getRuntime().exec(
                     "shutdown -s -t 120 -c /" 很晚了,该睡觉了,2 分钟后关闭计算机。/"");
           } catch (IOException e) {
              appendLog(_out, e.getMessage());
           }
           bHasShutDownPC = true;
       }
    }
}

希望本文所述对大家的Java程序设计有所帮助。

时间: 2014-11-19

java定时任务的实现方法

复制代码 代码如下: package com.ucap.sms; import java.util.Timer; import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener; public class SmsListener implements ServletContextListener{    private Timer timer=null; public void contex

java当中的定时器的4种使用方式

对于开发游戏项目的同胞来说,Timer 这个东西肯定不会陌生,今天对以前自己经常使用的定时进行了一番小小的总结!没有写具体实现的原理,只是列举出了其中的四种比较常见的使用方法,相对而言,所以只要按照其所列举的例子仿照即可! import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class TimeTest { public stati

java编程实现邮件定时发送的方法

本文实例讲述了java编程实现邮件定时发送的方法.分享给大家供大家参考,具体如下: 最近做项目时客户提出了一个需求:系统定时发送E-mail到其客户,达到通知的效果.先将实例分享给大家,如果确实有一些帮助的话,请大家来点掌声! 首先介绍java定时器(java.util.Timer)有定时执行计划任务的功能,通过设定定时器的间隔时间,会自动在此间隔时间后执行预先安排好的任务(java.util. TimerTask) 如: 每隔一个小时执行任务 timer.schedule(TimerTask,

JAVA中 Spring定时器的两种实现方式

目前有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz. 1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 import java.util.TimerTask; public class EmailReportTask extends TimerTask{ @Override public void run() { ... } } 在Spring定义 ... 配置Spring定时器 <bean id=&quo

java 动态增加定时任务示例

整理文档,java 动态增加定时任务示例,直接上代码. import org.apache.tools.ant.util.DateUtils; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.impl.StdSchedulerFactory; import ja

Java定时任务的三种实现方法

译者注:个人觉得用定时任务来跑垃圾回收不是很好的例子,从译者接触到的项目来看,比较常见的是用定时任务来进行非实时计算,清除临时数据.文件等.在本文里,我会给大家介绍3种不同的实现方法:1.普通thread实现2.TimerTask实现3.ScheduledExecutorService实现 一.普通thread 这是最常见的,创建一个thread,然后让它在while循环里一直运行着,通过sleep方法来达到定时任务的效果.这样可以快速简单的实现,代码如下: 复制代码 代码如下: public

Java中指定时区的3种方法

这两天在做与某知名一卡通公司的单点登录集成(我们的产品使用Java编写,对方的程序使用.Net编写)其中有一项参数是时间戳.即当前时间相对于公元1970-1-1 00:00:00的秒数.按照他们给出的文档我完成了Java部分的编写,时间戳部分很简单,一句话: 复制代码 代码如下: private String createTimestamp() //timestamp     {         return System.currentTimeMillis() / 1000 + ""

java定时调度器(Quartz)使用实例

1.Quartz定时器执行流程Quartz需要定义执行任务.触发器,在任务中指定执行的类对象及对象的方法,触发器中定义执行的时间.执行的任务. 2.在WEB环境中的配置 复制代码 代码如下: <!--定义任务类 --><bean id = "tmpTask" class="com.tmp.task.BcdTask"/><!-- 定义调用对象和调用对象的方法, tmpWork为BcdTask中的一个方法--><bean id=

使用java执行定时任务示例

这是一个演示如何使用java执行定时任务的实例,本实例开始运行后不会自动结束,请在运行本实例后手动结束程序. 复制代码 代码如下: package com.hongyuan.test; import java.awt.Desktop;import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import j

java中 spring 定时任务 实现代码

复制代码 代码如下: import org.apache.log4j.*;public class TaskJob {       public static Logger log = Logger                     .getLogger(TaskJob.class);       public void SayHello() {              // TODO Auto-generated method stub              try {      

java 中Spring task定时任务的深入理解

java 中Spring task定时任务的深入理解 在工作中有用到spring task作为定时任务的处理,spring通过接口TaskExecutor和TaskScheduler这两个接口的方式为异步定时任务提供了一种抽象.这就意味着spring容许你使用其他的定时任务框架,当然spring自身也提供了一种定时任务的实现:spring task.spring task支持线程池,可以高效处理许多不同的定时任务.同时,spring还支持使用Java自带的Timer定时器和Quartz定时框架.

Java中Spring获取bean方法小结

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢? Bean工厂(com.springframework.beans.factory.BeanFactory)是Spring框架最核心的接口,它提供了高级IoC的配置机制.BeanFactory使管理不同类型的Java对象成为可能,应用上下文(com.springframework.context.ApplicationContext)建立在BeanFactory基础之上,提供

Java中Spring Boot+Socket实现与html页面的长连接实例详解

Spring Boot+Socket实现与html页面的长连接,客户端给服务器端发消息,服务器给客户端轮询发送消息,附案例源码 功能介绍 客户端给所有在线用户发送消息客户端给指定在线用户发送消息服务器给客户端发送消息(轮询方式) 注意:socket只是实现一些简单的功能,具体的还需根据自身情况,代码稍微改造下 项目搭建 项目结构图 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xml

java中synchronized(同步代码块和同步方法)详解及区别

 java中synchronized(同步代码块和同步方法)详解及区别 问题的由来: 看到这样一个面试题: //下列两个方法有什么区别 public synchronized void method1(){} public void method2(){ synchronized (obj){} } synchronized用于解决同步问题,当有多条线程同时访问共享数据时,如果进行同步,就会发生错误,Java提供的解决方案是:只要将操作共享数据的语句在某一时段让一个线程执行完,在执行过程中,其他

详解java 中Spring jsonp 跨域请求的实例

详解java 中Spring jsonp 跨域请求的实例 jsonp介绍 JSONP(JSON with Padding)是JSON的一种"使用模式",可用于解决主流浏览器的跨域数据访问的问题.由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外.利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSO

java中Spring Security的实例详解

java中Spring Security的实例详解 spring security是一个多方面的安全认证框架,提供了基于JavaEE规范的完整的安全认证解决方案.并且可以很好与目前主流的认证框架(如CAS,中央授权系统)集成.使用spring security的初衷是解决不同用户登录不同应用程序的权限问题,说到权限包括两部分:认证和授权.认证是告诉系统你是谁,授权是指知道你是谁后是否有权限访问系统(授权后一般会在服务端创建一个token,之后用这个token进行后续行为的交互). spring

JAVA 中Spring的@Async用法总结

JAVA 中Spring的@Async用法总结 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3.x之后,就已经内置了@Async来完美解决这个问题,本文将完成介绍@Async的用法. 1.  何为异步调用? 在解释异步调用之前,我们先来看同步调用的定义:同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果. 异步调用则是只是发送了调用的

Java中Math类常用方法代码详解

近期用到四舍五入想到以前整理了一点,就顺便重新整理好经常见到的一些四舍五入,后续遇到常用也会直接在这篇文章更新... public class Demo{ public static void main(String args[]){ /** *Math.sqrt()//计算平方根 *Math.cbrt()//计算立方根 *Math.pow(a, b)//计算a的b次方 *Math.max( , );//计算最大值 *Math.min( , );//计算最小值 */ System.out.pri

java 中同步方法和同步代码块的区别详解

java 中同步方法和同步代码块的区别详解 在Java语言中,每一个对象有一把锁.线程可以使用synchronized关键字来获取对象上的锁.synchronized关键字可应用在方法级别(粗粒度锁)或者是代码块级别(细粒度锁). 问题的由来: 看到这样一个面试题: //下列两个方法有什么区别 public synchronized void method1(){} public void method2(){ synchronized (obj){} } synchronized用于解决同步问