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

时间:2018-04-04 20:35:29

标签: java multithreading scala concurrency

我是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服务器如何继续运行?在每个框架下面都有一段时间(真实)循环吗?

任何帮助都将不胜感激。

2 个答案:

答案 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()线程在启动服务器线程后立即终止。