守护进程线程未按预期工作 package main.components; 导入java.io.Serializable; 导入java.util.Scanner; 导入java.util.concurrent.TimeUnit; 公共类MainSnoozerx实现可运行、可序列化{ 私有静态最终长serialVersionUID=1L; 私有静态int min=0; 静态线程mnz=新线程(新的MainSnoozerx()); 私用长转换桶=0l; 专用扫描仪scn=新扫描仪(System.in); @凌驾 公开募捐{ //TODO自动生成的方法存根 试一试{ 做{ System.out.println(“输入打盹的分钟数…”); min=scn.nextInt(); }虽然(min

守护进程线程未按预期工作 package main.components; 导入java.io.Serializable; 导入java.util.Scanner; 导入java.util.concurrent.TimeUnit; 公共类MainSnoozerx实现可运行、可序列化{ 私有静态最终长serialVersionUID=1L; 私有静态int min=0; 静态线程mnz=新线程(新的MainSnoozerx()); 私用长转换桶=0l; 专用扫描仪scn=新扫描仪(System.in); @凌驾 公开募捐{ //TODO自动生成的方法存根 试一试{ 做{ System.out.println(“输入打盹的分钟数…”); min=scn.nextInt(); }虽然(min,java,multithreading,Java,Multithreading,您的方法不对,但JVM将继续运行,同时至少有一个非守护进程线程处于活动状态。main线程不是守护进程线程,如果在主线程退出之前没有创建其他非守护进程线程,JVM将退出 如果希望JVM继续运行,请删除setDaemon调用您启动了该线程,但从未告诉Java您希望重新完成该工作。您需要在启动后添加mnz.join()) 如果您决定将所有run()代码放在while循环中并更改循环,那么您就获得了所需的行为 像这样 package main.components; import java.io.Se

您的方法不对,但JVM将继续运行,同时至少有一个非守护进程线程处于活动状态。
main
线程不是守护进程线程,如果在主线程退出之前没有创建其他非守护进程线程,JVM将退出


如果希望JVM继续运行,请删除
setDaemon
调用

您启动了该线程,但从未告诉Java您希望重新完成该工作。您需要在启动后添加
mnz.join()

如果您决定将所有run()代码放在while循环中并更改循环,那么您就获得了所需的行为

像这样

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

}

这很好:)…Thread.join();实际上是做什么的?它的上下文是否只停留在守护进程线程上?join是一种说“ok”的方式,告诉我结果。如果线程仍在工作,调用join可以阻止主线程。(在这种情况下,它是并且将始终是,因为线程代码位于无限循环中)。顺便说一句,你的setDaemon不再相关了。因此我的线程现在就像一个普通线程一样工作,我们永远不会结束它,因为它是在循环中。那么我如何利用daemon线程来实现这一点(我的意思是为什么要使用daemon线程?)如果你想做其他事情并在后台提供服务,那么daemon线程很有用。如果您的程序只执行守护进程作业,那么它不是守护进程,这可能就是为什么Java不允许您在没有主线程执行作业的情况下运行守护进程线程的原因。
@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();
}