- 相關(guān)推薦
java實(shí)現電腦定時(shí)關(guān)機的方法
Java能夠自動(dòng)處理對象的引用和間接引用,實(shí)現自動(dòng)的無(wú)用單元收集,使用戶(hù)不必為存儲管理問(wèn)題煩惱,能更多的時(shí)間和精力花在研發(fā)上。下面是小編收集的關(guān)于java實(shí)現電腦定時(shí)關(guān)機的方法,希望大家認真閱讀!
一、問(wèn)題:
最近想找個(gè)軟件來(lái)控制電腦的關(guān)機時(shí)間,在網(wǎng)上找了幾個(gè),都是可視化界面的可以設置具體的關(guān)機時(shí)間的軟件。由于我想編寫(xiě)的關(guān)機程序是運行在別人機器上,只能讓該機器在晚上17 點(diǎn)到23 點(diǎn)25 分才上網(wǎng),到了23 點(diǎn)25 分就可以自動(dòng)關(guān)機。為了讓別人感覺(jué)不到這個(gè)軟件的“存在”(免得使用者自己關(guān)閉定時(shí)關(guān)機軟件),所以我想把關(guān)機軟件注冊為服務(wù)的方式,運行在后臺。這里介紹下如何利用javaService 軟件把java 程序注冊為windows 服務(wù)。
二、實(shí)現方法:
1. 利用javaService 注冊java 程序為windows 服務(wù)
、 下載javaService
訪(fǎng)問(wèn)網(wǎng)址http://javaservice.objectweb.org/ 下載windows 版本的javaService 文件,我下載的是JavaService-2.0.10.rar ,目前最新的版本就是“2.0.10 ”。
、 安裝javaService
解壓我們下載下來(lái)的javaServices 到一個(gè)目錄,我是解壓到目錄“D:/software/JavaService-2.0.10 ”下(解壓到任何目錄都可以,最好別解壓到中文目錄,省的出現問(wèn)題 )
、 編寫(xiě)定時(shí)關(guān)機代碼
1) 類(lèi)的名字為:
com.test.timer.TimerShutDownWindows
2) 把編寫(xiě)后的java 文件導出為class 的形式,把導出的類(lèi)放到目錄“D:/software/JavaService-2.0.10/classes/com/test/timer ”下。也就是把導出的com 包放到
“D:/software/JavaService-2.0.10/classes” 目錄下。
、 注冊java 程序為windows 服務(wù)
進(jìn)入“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 “后面的參數為服務(wù)的名稱(chēng),“-start ”參數后邊是要啟動(dòng)的類(lèi)名,“Djava.class.path ”后面參數中的
“D:/software/JavaService-2.0.10/classe ”地址是我的“TimerShutDownWindows ”類(lèi)存放的路徑,實(shí)際應用中修改為自己的classPath 即可。
這里需要注意幾點(diǎn):
1) “%JAVA_HOME% ”jdk 目錄,如果沒(méi)有配置jdk 目錄,則替換為jdk 的實(shí)際絕對地址。
2) -Djava.class.path 是必須的,因為服務(wù)啟動(dòng)的時(shí)候無(wú)法訪(fǎng)問(wèn)系統的CLASSPATH 變量,所以必須在這里聲明;如果jar 比較多,為避免寫(xiě)的命令過(guò)長(cháng),我們可以使用“-Djava.ext.dirs=jars 所在目錄”參數。
3) 服務(wù)添加之后,可以在命令行中敲入“services.msc ”命令來(lái)查看所有服務(wù),并可以對服務(wù)的啟動(dòng)類(lèi)型(自動(dòng)啟動(dòng)還是手動(dòng)啟動(dòng)等)進(jìn)行修改。
、 測試
1) 啟動(dòng)服務(wù)
當我們注冊完服務(wù)后,我們可以通過(guò)命令“net start MyShutDownService ”來(lái)啟動(dòng)該服務(wù),服務(wù)啟動(dòng)后會(huì )在D 盤(pán)根目錄生成my_shutdown.log 日志文件。
2) 關(guān)閉服務(wù)
如果我們要關(guān)閉服務(wù),可以通過(guò)命令“net stop MyShutDownService ”來(lái)關(guān)閉該服務(wù)。
3) 刪除服務(wù)
當我們想刪除該服務(wù)時(shí),可以使用命令“sc delete MyShutDownService ”來(lái)刪除該服務(wù)。
2. 定時(shí)關(guān)機代碼
代碼如下:
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 {
/* 檢測是否需要關(guān)機的時(shí)間間隔 */
private static long m_nDetectInterval = 5000;
/* 記錄上次檢測的時(shí)間,以毫秒為單位 */
private static long m_lLastMilliSeconds = 0;
/* 可以使用電腦的最小小時(shí) */
private static int m_nUsePCMinHour = 17;
/* 可以使用電腦的最大小時(shí) */
private static int m_nUseComputerMaxHour = 23;
/* 如果分鐘超過(guò)這個(gè)時(shí)間,則關(guān)機計算機 */
private static int m_nMinutes = 25;
/* 記錄日志的文件的保存位置 */
private static String m_sLogFile = "D:" + File.separator
+ "my_shutdown.log";
/* 記錄當前系統是否已經(jīng)啟動(dòng)自動(dòng)關(guān)閉程序 */
private static boolean bHasShutDownPC = false;
/**
* @param args
*/
public static void main(String[] args) {
// 1. 單獨開(kāi)啟一個(gè)線(xiàn)程去檢測
Thread aThread = new Thread(new TimerDetector());
aThread.start();
}
/**
* 定義內部類(lè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. 判斷當前系統時(shí)間是否被修改過(guò)
boolean bShoudShutDownPC = validateShoudShutDownPC(out);
if (bShoudShutDownPC) {
// 驗證沒(méi)通過(guò),強制關(guān)機
exectueShutDown(out);
} else {
bHasShutDownPC = false;
}
// 2. 當前線(xiàn)程休眠下
try {
Thread.sleep(m_nDetectInterval);
} catch (InterruptedException e) {
appendLog(out, e.getMessage());
}
}
}
/**
* 驗證當前時(shí)間是否是需要關(guān)機的時(shí)間
*
* @return
*/
private boolean validateShoudShutDownPC(PrintWriter _out) {
// 1. 判斷是否修改了系統時(shí)間
boolean bHasModifySystemTime = detectModifySytemTime(_out);
appendLog(_out, "bHasModifySystemTime :" + bHasModifySystemTime);
if (bHasModifySystemTime) {
return bHasModifySystemTime;
}
// 2. 沒(méi)有修改系統時(shí)間,則判斷當前時(shí)間是否超過(guò)了指定的時(shí)間
boolean bShoudSleep = nowIsSleepTime();
appendLog(_out, "bShoudSleep :" + bShoudSleep);
if (bShoudSleep) {
return bShoudSleep;
}
return false;
}
/**
* 判斷當前時(shí)間是否應該休息的時(shí)間
*
* @return
*/
private boolean nowIsSleepTime() {
// 1. 獲取當前小時(shí)和分鐘
Calendar aCalendar = Calendar.getInstance();
int nHour = aCalendar.get(Calendar.HOUR_OF_DAY);
int nMinute = aCalendar.get(Calendar.MINUTE);
// 2. 判斷當前小時(shí)是否在可以使用PC 的時(shí)間內, 最大小時(shí)為23
if (nHour < m_nUsePCMinHour) {
return true;
}
// 23 點(diǎn)需要單獨判斷,超過(guò)23 點(diǎn)30 就應該休息
if ((nHour >= m_nUseComputerMaxHour) && (nMinute >= m_nMinutes)) {
return true;
}
// 3. 非休息時(shí)間
return false;
}
/**
* 判斷是否有人修改了系統時(shí)間,如果有人修改了系統時(shí)間返回true ,
* 否則返回false
*
* @return
*/
private boolean detectModifySytemTime(PrintWriter _out) {
// 1. 第一次檢測系統時(shí)間
if (m_lLastMilliSeconds == 0) {
m_lLastMilliSeconds = System.currentTimeMillis();
return false;
}
// 2. 檢測兩次時(shí)間的差值
long lInteral = System.currentTimeMillis() - m_lLastMilliSeconds;
lInteral = Math.abs(lInteral);
// 3. 判斷兩次的時(shí)間間隔, 兩次結果不一定完全等于 m_nDetectInterval ,允許誤差為1 分鐘
long lMaxInterval = m_nDetectInterval + 60 * 1000;
appendLog(_out, "lInteral :::" + lInteral);
appendLog(_out, "lMaxInterval :::" + lMaxInterval);
if (lInteral > lMaxInterval) {
// 有人修改了系統時(shí)間,強制關(guān)機
return true;
}
// 4. 只有沒(méi)人修改時(shí)間才記錄上次檢測時(shí)間
m_lLastMilliSeconds = System.currentTimeMillis();
return false;
}
/**
* 在指定的流中寫(xiě)入日志信息
*
* @param _outWriter
* @param _sAppendContent
*/
private void appendLog(PrintWriter _outWriter, String _sAppendContent) {
if (_outWriter == null) {
return;
}
_outWriter.println(_sAppendContent);
}
/**
* 執行關(guān)機命令
*/
private void exectueShutDown(PrintWriter _out) {
if (bHasShutDownPC) {
SimpleDateFormat df = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
appendLog(_out, " 系統即將關(guān)閉, 當前時(shí)間:" + df.format(new Date()));
return;
}
appendLog(_out, " 有人修改了系統時(shí)間,系統強制關(guān)機!");
// 關(guān)機
try {
Runtime.getRuntime().exec(
"shutdown -s -t 120 -c /" 很晚了,該睡覺(jué)了,2 分鐘后關(guān)閉計算機。/"");
} catch (IOException e) {
appendLog(_out, e.getMessage());
}
bHasShutDownPC = true;
}
}
}
【java實(shí)現電腦定時(shí)關(guān)機的方法】相關(guān)文章:
win7系統定時(shí)關(guān)機設置方法07-30
Java動(dòng)態(tài)代理實(shí)現AOP的方法07-22
電腦關(guān)機后自動(dòng)重啟解決方法09-13
電腦鼠標關(guān)機后發(fā)光問(wèn)題的解決方法05-11
強制關(guān)機對電腦有什么危害09-25