簡體   English   中英

守護進程線程未按預期工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM