java wrapper服务和持续监听的问题,必须写死循环吗?或者说,所有的线程都需要一个死循环来维护才能监听吗?

发布于 09-06 15:37 字数 2032 浏览 29 评论 0

对于这个情况个人理解:
wrapper服务中,WrapperListener启动一个线程来执行任务,如果这个线程直接把他那段代码给跑完了,任务执行完了,那线程就会被释放销毁。如果想让他持续运行,就是持续监听,怎么办呢,写个死循环,反正让程序不结束就行了。

public class ApiProviderStart implements WrapperListener {

private static Logger logger = null;
public static volatile boolean running = true;
public static void main(String[] args) {
    WrapperManager.start(new ApiProviderStart(), args);
}


public Integer start(final String[] args) {
    new Thread(new Runnable() {
        public void run() {
            System.setProperty("java.net.preferIPv4Stack", "true");
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
            context.start();
            System.out.println("-----------Start provider main process -----------");
            try {
                Properties props = new Properties();
                props.load(ApiProviderStart.class.getClassLoader().getResourceAsStream("log4j.properties"));
            } catch (IOException e) {
                WrapperManager.log(WrapperManager.WRAPPER_LOG_LEVEL_ERROR, e.getLocalizedMessage());
            }
            logger = Logger.getLogger(ApiProviderStart.class);
            logger.info("--------------Dubbo provider service running -------------");
            
            while(running) {
                
            }
            
            context.close();
        }
    }).start();
    return null;
}

public int stop(int arg0) {
    running = false;
    return 0;
}

public void controlEvent(int arg0) {

}

}

还是个人理解:这段代码就是用spring加载了一个配置文件,后面spring干的什么其实可以忽略,(我在括号里说说,就是参考dubbo官网上的一套做法把接口发布到zookeeper上去,别的地方的consumer能调用我的接口服务访问数据库)。重点在于为啥我必须写一个死循环,不然这个wrapper服务一启动就自己关掉了。写了死循环能持续运行监听了,但是如果想安装成windows服务,又不太好看了,安装完启动的时候会永远显示服务“正在启动中”,因为start里面有死循环啊,停服务只能把相关的jre什么的都杀掉才行。

由此我在想,每次设计一个程序的时候,如果需要用到持续维护一个线程让他去做某些事情,需要怎么写呢,难道都往后面塞个死循环吗?

我对wrapper一点都不了解,只是依葫芦画瓢设计的时候才有这一系列疑问,希望熟练的人点拨一下在下,告诉我怎么去理解。还有怎么去接触与线程有关的设计方法。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

挽袖吟2022-09-13 15:37:55

用死循环会消耗大量CPU时间, 要改用sleep或wait才行,或在循环里加上sleep

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文