我正在用 Java 编写一个服务器,它是多线程的。我构建了三个主要的活动线程,并从我的main方法开始:
public class Run{
public static void main(String[] args){
try{
/*
* Definition and initialization of "server," "time," and
* "commands" variables not shown.
*/
new Thread(server).start();
new Thread(time).start();
new Thread(commands).start();
}catch(FileNotFoundException unfound){
/* Exception code not shown */
}catch(IOException ioe){
/* Exception code not shown */
}
}
}
例如,我的命令线程用于通过在控制台窗口中输入“q”来停止服务器。commands的run 方法定义如下:
public void run(){
while(server.running.get()){
try{
String next = scan.nextLine();
if(next.equalsIgnoreCase("q")){
server.shutdown();
close();
}else
System.out.println(LocalDateTime.now() + " - Unknown command.");
}catch(IOException ioe){
System.out.println(LocalDateTime.now() + " - The commands thread has produced an exception.");
}
}
}
*其中扫描定义为:Scanner scan = new Scanner(System.in);
当我运行我的服务器时,我的所有线程都工作,除了命令线程,因为控制台不接受输入。
然后我意识到,如果我等待我的服务器线程(这是我最关心的线程)加入我的主(静态方法)线程,我的命令线程就会工作。如果我将主要方法代码更改为以下内容,则意味着控制台接受输入:
Thread t1 = new Thread(server);
t1.start();
new Thread(time).start();
new Thread(commands).start();
try{
t1.join();
}catch(Exception e){
e.printStackTrace();
}
现在我的问题。为什么控制台输入仅在主线程仍处于活动状态时才有效?老实说,我不再需要我的主线程,所以让它终止就可以了。
只是在没有名称的情况下定义了我的线程,我在这里做错了什么吗?我能够很好地终止每个线程,因为它们相互交织,并且除了我的命令线程之外一切正常。
编辑: 我非常感谢有关解决此问题的所有答案,但我真正追求的是发生这种情况的原因。
服务器线程螺旋式下降并做自己的事情(即不断寻找新的连接并为这些连接建立新环境)并且更新线程关闭并做自己的事情(即这用于更新我的配额计数,因为我我正在使用谷歌 API)。除此之外,上面的代码说明了我在做什么。