亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

計(jì)算機(jī)等級(jí)

java實(shí)現(xiàn)電腦定時(shí)關(guān)機(jī)的方法

時(shí)間:2024-08-10 07:41:39 計(jì)算機(jī)等級(jí) 我要投稿
  • 相關(guān)推薦

java實(shí)現(xiàn)電腦定時(shí)關(guān)機(jī)的方法

  Java能夠自動(dòng)處理對(duì)象的引用和間接引用,實(shí)現(xiàn)自動(dòng)的無用單元收集,使用戶不必為存儲(chǔ)管理問題煩惱,能更多的時(shí)間和精力花在研發(fā)上。下面是小編收集的關(guān)于java實(shí)現(xiàn)電腦定時(shí)關(guān)機(jī)的方法,希望大家認(rèn)真閱讀!

java實(shí)現(xiàn)電腦定時(shí)關(guān)機(jī)的方法

  一、問題:

  最近想找個(gè)軟件來控制電腦的關(guān)機(jī)時(shí)間,在網(wǎng)上找了幾個(gè),都是可視化界面的可以設(shè)置具體的關(guān)機(jī)時(shí)間的軟件。由于我想編寫的關(guān)機(jī)程序是運(yùn)行在別人機(jī)器上,只能讓該機(jī)器在晚上17 點(diǎn)到23 點(diǎn)25 分才上網(wǎng),到了23 點(diǎn)25 分就可以自動(dòng)關(guān)機(jī)。為了讓別人感覺不到這個(gè)軟件的“存在”(免得使用者自己關(guān)閉定時(shí)關(guān)機(jī)軟件),所以我想把關(guān)機(jī)軟件注冊(cè)為服務(wù)的方式,運(yùn)行在后臺(tái)。這里介紹下如何利用javaService 軟件把java 程序注冊(cè)為windows 服務(wù)。

  二、實(shí)現(xiàn)方法:

  1. 利用javaService 注冊(cè)java 程序?yàn)閣indows 服務(wù)

 、 下載javaService

  訪問網(wǎng)址http://javaservice.objectweb.org/ 下載windows 版本的javaService 文件,我下載的是JavaService-2.0.10.rar ,目前最新的版本就是“2.0.10 ”。

 、 安裝javaService

  解壓我們下載下來的javaServices 到一個(gè)目錄,我是解壓到目錄“D:/software/JavaService-2.0.10 ”下(解壓到任何目錄都可以,最好別解壓到中文目錄,省的出現(xiàn)問題 )

  ③ 編寫定時(shí)關(guān)機(jī)代碼

  1) 類的名字為:

  com.test.timer.TimerShutDownWindows

  2) 把編寫后的java 文件導(dǎo)出為class 的形式,把導(dǎo)出的類放到目錄“D:/software/JavaService-2.0.10/classes/com/test/timer ”下。也就是把導(dǎo)出的com 包放到

  “D:/software/JavaService-2.0.10/classes” 目錄下。

 、 注冊(cè)java 程序?yàn)閣indows 服務(wù)

  進(jìn)入“D:/software/JavaService-2.0.10 “目錄,執(zhí)行如下命令:

  代碼如下:

  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 “后面的參數(shù)為服務(wù)的名稱,“-start ”參數(shù)后邊是要啟動(dòng)的類名,“Djava.class.path ”后面參數(shù)中的

  “D:/software/JavaService-2.0.10/classe ”地址是我的“TimerShutDownWindows ”類存放的路徑,實(shí)際應(yīng)用中修改為自己的classPath 即可。

  這里需要注意幾點(diǎn):

  1) “%JAVA_HOME% ”jdk 目錄,如果沒有配置jdk 目錄,則替換為jdk 的實(shí)際絕對(duì)地址。

  2) -Djava.class.path 是必須的,因?yàn)榉⻊?wù)啟動(dòng)的時(shí)候無法訪問系統(tǒng)的CLASSPATH 變量,所以必須在這里聲明;如果jar 比較多,為避免寫的命令過長(zhǎng),我們可以使用“-Djava.ext.dirs=jars 所在目錄”參數(shù)。

  3) 服務(wù)添加之后,可以在命令行中敲入“services.msc ”命令來查看所有服務(wù),并可以對(duì)服務(wù)的啟動(dòng)類型(自動(dòng)啟動(dòng)還是手動(dòng)啟動(dòng)等)進(jìn)行修改。

 、 測(cè)試

  1) 啟動(dòng)服務(wù)

  當(dāng)我們注冊(cè)完服務(wù)后,我們可以通過命令“net start MyShutDownService ”來啟動(dòng)該服務(wù),服務(wù)啟動(dòng)后會(huì)在D 盤根目錄生成my_shutdown.log 日志文件。

  2) 關(guān)閉服務(wù)

  如果我們要關(guān)閉服務(wù),可以通過命令“net stop MyShutDownService ”來關(guān)閉該服務(wù)。

  3) 刪除服務(wù)

  當(dāng)我們想刪除該服務(wù)時(shí),可以使用命令“sc delete MyShutDownService ”來刪除該服務(wù)。

  2. 定時(shí)關(guān)機(jī)代碼

  代碼如下:

  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 {

  /* 檢測(cè)是否需要關(guān)機(jī)的時(shí)間間隔 */

  private static long m_nDetectInterval = 5000;

  /* 記錄上次檢測(cè)的時(shí)間,以毫秒為單位 */

  private static long m_lLastMilliSeconds = 0;

  /* 可以使用電腦的最小小時(shí) */

  private static int m_nUsePCMinHour = 17;

  /* 可以使用電腦的最大小時(shí) */

  private static int m_nUseComputerMaxHour = 23;

  /* 如果分鐘超過這個(gè)時(shí)間,則關(guān)機(jī)計(jì)算機(jī) */

  private static int m_nMinutes = 25;

  /* 記錄日志的文件的保存位置 */

  private static String m_sLogFile = "D:" + File.separator

  + "my_shutdown.log";

  /* 記錄當(dāng)前系統(tǒng)是否已經(jīng)啟動(dòng)自動(dòng)關(guān)閉程序 */

  private static boolean bHasShutDownPC = false;

  /**

  * @param args

  */

  public static void main(String[] args) {

  // 1. 單獨(dú)開啟一個(gè)線程去檢測(cè)

  Thread aThread = new Thread(new TimerDetector());

  aThread.start();

  }

  /**

  * 定義內(nèi)部類

  *

  * @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. 記錄服務(wù)啟動(dòng)時(shí)間

  appendLog(out, " 服務(wù)啟動(dòng)時(shí)間:" + df.format(new Date()));

  while (true) {

  // 1. 判斷當(dāng)前系統(tǒng)時(shí)間是否被修改過

  boolean bShoudShutDownPC = validateShoudShutDownPC(out);

  if (bShoudShutDownPC) {

  // 驗(yàn)證沒通過,強(qiáng)制關(guān)機(jī)

  exectueShutDown(out);

  } else {

  bHasShutDownPC = false;

  }

  // 2. 當(dāng)前線程休眠下

  try {

  Thread.sleep(m_nDetectInterval);

  } catch (InterruptedException e) {

  appendLog(out, e.getMessage());

  }

  }

  }

  /**

  * 驗(yàn)證當(dāng)前時(shí)間是否是需要關(guān)機(jī)的時(shí)間

  *

  * @return

  */

  private boolean validateShoudShutDownPC(PrintWriter _out) {

  // 1. 判斷是否修改了系統(tǒng)時(shí)間

  boolean bHasModifySystemTime = detectModifySytemTime(_out);

  appendLog(_out, "bHasModifySystemTime :" + bHasModifySystemTime);

  if (bHasModifySystemTime) {

  return bHasModifySystemTime;

  }

  // 2. 沒有修改系統(tǒng)時(shí)間,則判斷當(dāng)前時(shí)間是否超過了指定的時(shí)間

  boolean bShoudSleep = nowIsSleepTime();

  appendLog(_out, "bShoudSleep :" + bShoudSleep);

  if (bShoudSleep) {

  return bShoudSleep;

  }

  return false;

  }

  /**

  * 判斷當(dāng)前時(shí)間是否應(yīng)該休息的時(shí)間

  *

  * @return

  */

  private boolean nowIsSleepTime() {

  // 1. 獲取當(dāng)前小時(shí)和分鐘

  Calendar aCalendar = Calendar.getInstance();

  int nHour = aCalendar.get(Calendar.HOUR_OF_DAY);

  int nMinute = aCalendar.get(Calendar.MINUTE);

  // 2. 判斷當(dāng)前小時(shí)是否在可以使用PC 的時(shí)間內(nèi), 最大小時(shí)為23

  if (nHour < m_nUsePCMinHour) {

  return true;

  }

  // 23 點(diǎn)需要單獨(dú)判斷,超過23 點(diǎn)30 就應(yīng)該休息

  if ((nHour >= m_nUseComputerMaxHour) && (nMinute >= m_nMinutes)) {

  return true;

  }

  // 3. 非休息時(shí)間

  return false;

  }

  /**

  * 判斷是否有人修改了系統(tǒng)時(shí)間,如果有人修改了系統(tǒng)時(shí)間返回true ,

  * 否則返回false

  *

  * @return

  */

  private boolean detectModifySytemTime(PrintWriter _out) {

  // 1. 第一次檢測(cè)系統(tǒng)時(shí)間

  if (m_lLastMilliSeconds == 0) {

  m_lLastMilliSeconds = System.currentTimeMillis();

  return false;

  }

  // 2. 檢測(cè)兩次時(shí)間的差值

  long lInteral = System.currentTimeMillis() - m_lLastMilliSeconds;

  lInteral = Math.abs(lInteral);

  // 3. 判斷兩次的時(shí)間間隔, 兩次結(jié)果不一定完全等于 m_nDetectInterval ,允許誤差為1 分鐘

  long lMaxInterval = m_nDetectInterval + 60 * 1000;

  appendLog(_out, "lInteral :::" + lInteral);

  appendLog(_out, "lMaxInterval :::" + lMaxInterval);

  if (lInteral > lMaxInterval) {

  // 有人修改了系統(tǒng)時(shí)間,強(qiáng)制關(guān)機(jī)

  return true;

  }

  // 4. 只有沒人修改時(shí)間才記錄上次檢測(cè)時(shí)間

  m_lLastMilliSeconds = System.currentTimeMillis();

  return false;

  }

  /**

  * 在指定的流中寫入日志信息

  *

  * @param _outWriter

  * @param _sAppendContent

  */

  private void appendLog(PrintWriter _outWriter, String _sAppendContent) {

  if (_outWriter == null) {

  return;

  }

  _outWriter.println(_sAppendContent);

  }

  /**

  * 執(zhí)行關(guān)機(jī)命令

  */

  private void exectueShutDown(PrintWriter _out) {

  if (bHasShutDownPC) {

  SimpleDateFormat df = new SimpleDateFormat(

  "yyyy-MM-dd HH:mm:ss");

  appendLog(_out, " 系統(tǒng)即將關(guān)閉, 當(dāng)前時(shí)間:" + df.format(new Date()));

  return;

  }

  appendLog(_out, " 有人修改了系統(tǒng)時(shí)間,系統(tǒng)強(qiáng)制關(guān)機(jī)!");

  // 關(guān)機(jī)

  try {

  Runtime.getRuntime().exec(

  "shutdown -s -t 120 -c /" 很晚了,該睡覺了,2 分鐘后關(guān)閉計(jì)算機(jī)。/"");

  } catch (IOException e) {

  appendLog(_out, e.getMessage());

  }

  bHasShutDownPC = true;

  }

  }

  }

【java實(shí)現(xiàn)電腦定時(shí)關(guān)機(jī)的方法】相關(guān)文章:

電腦定時(shí)關(guān)機(jī)的設(shè)置方法07-16

設(shè)置電腦定時(shí)自動(dòng)關(guān)機(jī)方法09-11

win7如何設(shè)置電腦定時(shí)關(guān)機(jī)09-13

Win7系統(tǒng)怎么設(shè)置電腦定時(shí)關(guān)機(jī)10-07

Java中g(shù)oto實(shí)現(xiàn)方法06-22

win7系統(tǒng)定時(shí)關(guān)機(jī)設(shè)置方法08-23

Java動(dòng)態(tài)代理實(shí)現(xiàn)AOP的方法10-24

Java實(shí)現(xiàn)點(diǎn)在線添加的方法10-15

電腦自動(dòng)關(guān)機(jī)的處理方法11-06

java實(shí)現(xiàn)web服務(wù)器的方法09-26