如何保持多线程Java/Scala应用程序的运行?

如何保持多线程Java/Scala应用程序的运行?,java,multithreading,scala,concurrency,Java,Multithreading,Scala,Concurrency,我对Scala/Java非常陌生,必须构建一个至少运行两个子服务的服务:一个基于套接字的订阅者监听消息以启动工人,另一个web服务器将为这些工人提供状态页面 我可以让这些东西运行,但在两者都启动后,整个过程立即退出,代码为0 我做了一些研究来了解Java中的用户线程与守护进程线程,以及一般的线程,所以现在我的方法基本上是这样的: val webServerThread = new Thread(WebServer(config)).start() val subscriberThread = n

我对Scala/Java非常陌生,必须构建一个至少运行两个子服务的服务:一个基于套接字的订阅者监听消息以启动工人,另一个web服务器将为这些工人提供状态页面

我可以让这些东西运行,但在两者都启动后,整个过程立即退出,代码为0

我做了一些研究来了解Java中的用户线程与守护进程线程,以及一般的线程,所以现在我的方法基本上是这样的:

val webServerThread = new Thread(WebServer(config)).start()
val subscriberThread = new Thread(Subscriber(config)).start()
val aliveThread = new Thread(keepAlive(true)).start()
第三个线程只包含一个while(true){}块,以保持用户线程正常运行

必须有一个更聪明的方法来做到这一点,但我不知道这是什么,似乎不可能发现。例如,http服务器如何保持运行?在每个框架下面都有一个while(true)循环吗

任何帮助都将不胜感激。

线程的
run()
方法必须是一个无止境的循环,直到出现某种情况并退出循环

要等待线程退出,方法如下:

final Runnable runnable = new Runnable() {
    public void run() {
        // do stuff
    }
};

final Thread thread = new Thread(runnable);
thread.start();
try {
    thread.join();
} catch (final InterruptedException e) {
    // deal with exception
}
显然,这将只等待一个线程。这取决于您的场景,这是否有意义。或者,您可以使用
ThreadPoolExecutor
,调用
shutdown()
shutdownNow()
方法,并使用
WaitTermination
使其停止。

线程的
run()
方法必须是一个无限循环,直到出现某种情况并退出循环

要等待线程退出,方法如下:

final Runnable runnable = new Runnable() {
    public void run() {
        // do stuff
    }
};

final Thread thread = new Thread(runnable);
thread.start();
try {
    thread.join();
} catch (final InterruptedException e) {
    // deal with exception
}
显然,这将只等待一个线程。这取决于您的场景,这是否有意义。或者,您可以使用
ThreadPoolExecutor
,调用
shutdown()
shutdownNow()
方法,并使用
等待终止
使其停止

因此,对于所有必须保持运行的服务,比如web服务器或其他东西,是否有一些代码基本上是
而(shouldlrun){//nothing}

不,没有任何理由让一个JRE线程什么都不做,而一个使用100%CPU却什么都不做的线程会更糟糕

程序中几乎每个线程都应该坐在一个循环中,等待做些什么。*例如,等待接收和处理来自外部源的输入的I/O线程,等待执行任务的池线程,等待执行下一个计划任务的调度程序线程

web服务必须至少有一个线程位于循环中并等待处理传入连接。我不记得如果不先做一些研究怎么写,因为有那么多开源web服务器:除了实践之外,没有理由自己写。Oracle JRE中甚至内置了一个。**在伪代码中,它可能如下所示:

while (! time_to_shut_down) {
    connection = WaitForIncomingConnection();
    clientThreadPool.handle(connection);
}
我可以让这些东西运行,但在两者都启动之后,整个过程立即退出,代码为0

我不知道你的程序为什么不能继续运行。我不熟悉Scala或
WebServer
类或
Subscriber

什么是
config
?如果您想通过提问来展示如何创建配置对象,也许有人可以帮助您


*该规则的一个例外是程序中的计算线程执行一次大规模计算,然后退出

**看。
server.start()调用是启动服务线程的原因。注意,
main()
线程在启动服务器线程后立即终止

因此,对于所有必须保持运行的服务,比如web服务器或其他东西,是否有一些代码基本上是
而(shouldlrun){//nothing}

不,没有任何理由让一个JRE线程什么都不做,而一个使用100%CPU却什么都不做的线程会更糟糕

程序中几乎每个线程都应该坐在一个循环中,等待做些什么。*例如,等待接收和处理来自外部源的输入的I/O线程,等待执行任务的池线程,等待执行下一个计划任务的调度程序线程

web服务必须至少有一个线程位于循环中并等待处理传入连接。我不记得如果不先做一些研究怎么写,因为有那么多开源web服务器:除了实践之外,没有理由自己写。Oracle JRE中甚至内置了一个。**在伪代码中,它可能如下所示:

while (! time_to_shut_down) {
    connection = WaitForIncomingConnection();
    clientThreadPool.handle(connection);
}
我可以让这些东西运行,但在两者都启动之后,整个过程立即退出,代码为0

我不知道你的程序为什么不能继续运行。我不熟悉Scala或
WebServer
类或
Subscriber

什么是
config
?如果您想通过提问来展示如何创建配置对象,也许有人可以帮助您


*该规则的一个例外是程序中的计算线程执行一次大规模计算,然后退出


**看。
server.start()调用是启动服务线程的原因。另外,请注意
main()
线程在启动服务器线程后立即终止。

线程在默认情况下不是守护进程,因此没有理由执行保持活动任务。创建web服务的真正方法是使用框架,如Java Enterprise Edition。然而,如果您对Java完全陌生,您可能想看看O'Reilly的学习Java。他们有一章是关于网络的,其中包括一个小型的web服务器(提示:他们使用的是一个)