【任务笔记】创建windows操作系统下的服务进程,并随操作系统启动自动开始执行

这个任务名称写的有点儿长,简单来说就是类似于linux系统下的守护进程。在windows系统中,被称为服务进程,可以在服务列表中查看、开启、关闭。

JAVA中其实进程的概念并不强烈,更多的接触到的是线程。而实现这个守护进程,其实用到的也是线程。还有一个工具JavaService

 

步骤如下:

1、建立两个类:一个负责控制线程的启停,一个就是运行的线程(代码简单,直接用txt写,javac一下就行)

import java.util.*;

public class MyService 
{

	private static Thread thread = null;
	private static Service service = null;

	/**
	 * 退出服务方法(该方法必须有参数 String [] args)
	 * 
	 * @param args
	 */
	public static void stopService(String[] args) 
	{
		System.out.println("停止服务");
		service.setRunFlag(false);
	}

	/**
	 * 启动服务方法(该方法必须有参数 String [] args)
	 * 
	 * @param args
	 */
	public static void startService(String[] args) 
	{
		System.out.println("启动服务");
		// 产生服务线程
		service = new Service();
		thread = new Thread();
		try 
		{
			// 将服务线程设定为用户线程,以避免StartService方法结束后线程退出
			thread.setDaemon(false);
			if (thread.isDaemon()) 
			{
				System.out.println("成功设定线程为用户线程!");
			}
			thread.start();
			service.run();//这句一定要有啊。我查资料的时候就因为没这句,怎么都不能执行o(╯□╰)o所以要避免“盲目崇拜”
		} 
		catch (Exception e) 
		{
			System.out.println("设定失败!");
		}
	}

}

class Service implements Runnable 
{

	private boolean runFlag = true;

	/**
	 * 设定服务线程运行标志值
	 */
	public synchronized void setRunFlag(boolean runFlag) 
	{
		this.runFlag = runFlag;
	}

	/**
	 * 取得服务线程运行标志值
	 */
	private synchronized boolean getRunFlag() 
	{
		return runFlag;
	}

	@Override
	public void run() 
	{
		System.out.println("服务线程开始运行。。。");
		while (getRunFlag()) 
		{
			/*
			 * 获取系统时间
			 */
			Calendar cal = Calendar.getInstance();
			long mis = cal.getTimeInMillis();
			System.out.println("当前时间:" + mis);
			try 
			{
				Thread.sleep(1000*300);
			}
			catch (InterruptedException e) 
			{
				e.printStackTrace();
			}
		}
		System.out.println("服务线程结束运行。。。");
	}
}

2、把JavaService的解压路径加入到path

这步也可以直接把JavaService复制到MyService.class那个目录里



3、然后就打开cmd命令,跳转至当前目录,执行如下语句

JavaService.exe -install TJS "%JAVA_HOME%/jre/bin/server/jvm.dll" -Xmx128m -Djava.class.path=%CLASSPATH%;D:\javaTest -start MyService -method startService -stop MyService -method stopService -out "%CD%/out.log" -err "%CD%/err.log" -current "%CD%"


标红那里相当重要!因为必须在-Djava.class.path后加上你的类所在目录才行。不然就会在启动时出现启动失败,找不到类这样的错误。网上有资料说在最后加个-auto,我是执行失败,而且没有auto也能开机自启。求解释~

TJSTestJavaService,也就是这个服务进程显示的进程名称

现在创建好了,启动方式有两种:

a、在命令行输入net start TJS

b、重启电脑(建议试试,这样可以比较直观的看到确实是开机自动运行的)

然后在out.log里就可以看到输出的结果了

在服务列表中也可以看到


不想要了也可以销毁:JavaService -uninstall TJS

所以要保证你的进程名称是唯一滴

关于每个命令的详细含义,运行机制神马的我就不过多的赘述了,网上都有。

笔记还是要有个笔记的样子才好

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页