守护程序线程未按预期工作

时间:2016-04-19 20:45:30

标签: java multithreading

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甚至一次。 我希望代码能够无休止地运行作为一个守护程序线程,并且用户只需设置一次分钟,然后暂停就会继续...

2 个答案:

答案 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();
}