java - 编写可以从不同 JVM 停止的长生命周期 Java 类

标签 java

我正在寻找任何教程/示例,展示编写独立 Java 类的最佳实践,该类将像服务器一样运行(不退出),并且可以通过从不同的调用中发出另一个命令来停止JVM(有点像 Tomcat 服务器)。是在 java.util.concurrent 中查找类的最佳方法吗,因为那里有一些有趣的类,例如 CountDownLatch?一个例子真的很有帮助。谢谢。

最佳答案

不确定您在寻找什么。

这是一个简单的服务器,它会愉快地计数到 MAXINT 并再次返回,直到停止为止。

您可以使用 JConsole 来停止它。

服务器.java

import javax.management.*;
import java.lang.management.*;
import java.util.concurrent.atomic.AtomicBoolean;

public class Server implements ServerMBean {
    AtomicBoolean running;

    public void register() throws Exception {
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
        ObjectName serverBeanName = null;
        serverBeanName = new ObjectName("ServerBean:name=TestBean");
        mbs.registerMBean(this, serverBeanName);
    }

    public void stop() {
        running.set(false);
    }

    public void runServer() throws Exception {
        int cnt = 0;
        running = new AtomicBoolean(true);
        while(running.get()) {
            Thread.sleep(1000);
            System.out.println("tic tic " + cnt++);
        }
    }

    public static void main(String args[]) throws Exception {
        Server bean = new Server();
        bean.register();
        bean.runServer();
    }
}

ServerMBean.java

public interface ServerMBean {
    public void stop();
}

这会注册一个简单的 JMX MBean,它具有单个方法 (stop),该方法将 running 变量设置为“false”,从而停止循环。请注意,“运行”是一个 AtomicBoolean,因为这很重要。如果你使用普通的 boolean 值,这很可能永远不会停止。它也适用于 volatile boolean 值。

如果您启动服务器(java Server),然后启动 JConsole,它将提供 Server 作为要连接的进程。然后进入MBeans选项卡,在 TreeView 中找到ServerBean -> TestBean -> Operations -> stop,点击停止按钮,服务器就会停止。

你想让你的服务器做什么,我不知道。但这让您体验到 40 行代码可以做什么......

关于java - 编写可以从不同 JVM 停止的长生命周期 Java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6784446/

相关文章:

java - 在 Java 中获取当前 Activity 文件(不是 Java 应用程序,例如 pdf)的完整路径

OSX 下的 JAVA_HOME 变量...它到底是什么?

java - "Failed to create jvm error code -1"每当我启动 android studio 时

java - Hibernate 中的自增

java - 缩小 JFrame 会导致绘图消失;靶心边框不显示

java - Maven android 编译多个源码目录

java - print() 方法未打印正确的 ArrayList 内容

Java Component.show()/hide() 已弃用……为什么?

java - Libgdx - 如何使用 "Long Press"?

java - 为什么 Jackson ObjectMapper 在将 JSON 字段转换为 Date 对象时出现此错误?无法从 String 反序列化 java.util.Date 类型的值