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甚至一次。 我希望代码能够无休止地运行作为一个守护程序线程,并且用户只需设置一次分钟,然后暂停就会继续...
答案 0 :(得分:4)
你有错误的方法,JVM将继续运行,同时至少有一个非守护进程线程处于活动状态。 main
线程不是守护程序线程,如果在主线程退出JVM之前没有创建其他非守护程序线程,则退出。
如果您希望JVM继续运行,请删除setDaemon
电话
答案 1 :(得分:1)
你没有告诉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();
}