程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java完成電腦准時關機的辦法

java完成電腦准時關機的辦法

編輯:關於JAVA

java完成電腦准時關機的辦法。本站提示廣大學習愛好者:(java完成電腦准時關機的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是java完成電腦准時關機的辦法正文


本文實例講述了java若何注冊成windows辦事法式及一個簡略的java准時關機法式代碼,分享給年夜家供年夜家參考。詳細辦法以下:

1、成績:

比來想找個軟件來掌握電腦的關機時光,在網上找了幾個,都是可視化界面的可以設置詳細的關機時光的軟件。因為我想編寫的關機法式是運轉在他人機械上,只能讓該機械在早晨17 點到23 點25 分才上彀,到了23 點25 分便可以主動關機。為了讓他人感到不到這個軟件的“存在”(省得應用者本身封閉准時關機軟件),所以我想把關機軟件注冊為辦事的方法,運轉在後台。這裡引見下若何應用javaService 軟件把java 法式注冊為windows 辦事。

2、完成辦法:

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法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved