如何保持多线程Java/Scala应用程序的运行?
我对Scala/Java非常陌生,必须构建一个至少运行两个子服务的服务:一个基于套接字的订阅者监听消息以启动工人,另一个web服务器将为这些工人提供状态页面 我可以让这些东西运行,但在两者都启动后,整个过程立即退出,代码为0 我做了一些研究来了解Java中的用户线程与守护进程线程,以及一般的线程,所以现在我的方法基本上是这样的:如何保持多线程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
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服务器(提示:他们使用的是一个)