[英]Daemon thread not working as expected
package main.components;
import java.io.Serializable;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
public class MainSnoozerx implements Runnable, Serializable {
private static final long serialVersionUID = 1L;
private static int min = 0;
static Thread mnz = new Thread(new MainSnoozerx());
private long convertedToMiliSec = 0l;
private Scanner scn = new Scanner(System.in);
@Override
public void run() {
// TODO Auto-generated method stub
try{
do{
System.out.println("Enter minutes to snooze..");
min = scn.nextInt();
}while(min<0);
convertedToMiliSec = TimeUnit.MINUTES.toMillis(min);
try {
Thread.sleep(convertedToMiliSec);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Alarm Now!!!");
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
mnz.setDaemon(true);
mnz.start();
}
}
誰能告訴我我在做什么錯/想念嗎? 我的程序在運行時就終止了,甚至沒有打印過syso。 我希望代碼可以作為守護進程線程無休止地運行,並且用戶只需設置一次分鍾,然后貪睡就會一直持續下去...
您遇到了錯誤的方法,當至少有一個非守護線程處於活動狀態時,JVM將繼續運行。 main
線程不是守護程序線程,如果在主線程退出之前未創建其他非守護程序線程,則JVM將退出。
如果希望JVM繼續運行,請除去setDaemon
調用
您在沒有通知Java的情況下就觸發了該線程,您希望完成該工作。 您需要在開始后添加一個mnz.join()
;)
有了該修復程序,您的線程肯定會運行一次。 如果決定將所有run()代碼放入while循環內並更改循環,那么您將獲得所需的行為。
像這樣
@Override
public void run() {
while (true) {
// TODO Auto-generated method stub
try {
while (min == 0) {
System.out.println("Enter minutes to snooze..");
min = scn.nextInt();
}
convertedToMiliSec = TimeUnit.MINUTES.toMillis(min);
try {
Thread.sleep(convertedToMiliSec);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Alarm Now!!!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
mnz.setDaemon(true);
mnz.start();
mnz.join();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.