我是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服务器如何继续运行?在每个框架下面都有一段时间(真实)循环吗?
任何帮助都将不胜感激。
答案 0 :(得分:2)
线程的 $(function(){
let NewContent='<div class="added"><p><label>What is your name? </label><input type="text" id="A"> </div></p><p>Your name is: <span class="Y"></span></p>'
let added = false;
let $content;
$(".addremove").on('click', function(){
if(this.checked){
/* HERE I REMOVE THE DEFAULT TEXT */
$(".default").empty();
/* HOW TO GET IT APPENDED BACK WHEN UNCHECKING THE BOX? */
if (!added) {
$content = $(NewContent).appendTo('.firstappend');
var name1 = document.getElementById('A');
name1.addEventListener('input', function() {
var result = document.querySelector('span.Y');
console.log(this.value );
result.innerHTML = this.value;
});
}
else $content.remove();
$(".default").appendTo(".X");
added = !added;
} else {
$(".default").html("<p>You don't have a name</p>");
$(".firstappend").empty();
}
});
});
方法必须是无限循环,直到出现某些情况并退出循环。
要等待线程退出,执行此操作的方法如下:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="toadd">
<input type="checkbox" class="addremove">Do you have a name?</input>
</div>
<div class="X"></div>
<div class="default"><p>You don't have a name</p></div>
<div class="firstappend"></div>
显然,那只会等待一个帖子。这取决于您的情况是否有意义。或者,您可以使用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()
来停止。
答案 1 :(得分:0)
因此,对于所有必须保持运行的服务,比如Web服务器或其他什么,是否有一些代码基本上只是
while(shouldRun) {//nothing}
?
没有。从来没有任何理由让JRE线程什么也不做,并且在完成时什么也不会使用100%CPU的线程会更糟。
程序中的每个线程都应该处于循环中,等待某些内容做。*例如,等待接收和处理来自某些外部源的输入的I / O线程,等待任务执行的池线程,一个等待执行下一个计划任务的调度程序线程。
Web服务必须至少有一个位于循环中的线程,并等待处理传入连接。我不记得如何在没有做一些研究的情况下写出来,因为那里有很多开源网络服务器:除了练习之外没有理由自己编写。 Oracle JRE甚至还有一个内置。**在伪代码中,它可能如下所示:
while (! time_to_shut_down) {
connection = WaitForIncomingConnection();
clientThreadPool.handle(connection);
}
我可以让这些东西运行,但在两次启动之后,整个过程会立即退出,代码为0。
我不知道为什么你的程序不会继续运行。我不熟悉Scala,或者WebServer
类或Subscriber
类。
什么是config
?如果您想要提出如何创建配置对象,可能有人会帮助您。
*该规则的一个例外是程序中的计算线程,它执行单个大规模计算然后退出。
**见https://stackoverflow.com/a/3732328/801894。该示例中的server.start();
调用将启动服务线程。并且,请注意main()
线程在启动服务器线程后立即终止。