为什么这个条件语句永远不会执行?

Why is this conditional statement never executing?

我正在研究 Oracle 发布的 "The Java Tutorial",我不确定为什么我无法从 "Concurrency" 章节中获取此示例中的条件语句来执行:

if ((System.currentTimeMillis() - startTime > patience) &&
                msgThread.isAlive())

startTime 变量在此之上被初始化为:

long startTime = System.currentTimeMillis();

patience 变量可以是 hard-coded 值(1 小时)或作为 command-line 参数传入的值(以秒为单位)。

    long patience = 1000 * 60 * 60; // initially 1 hour of patience

    // if there is a command-line arg
    if (args.length > 0) {
        try {
            // takes command-line arg as seconds
            patience = Long.parseLong(args[0]) * 1000;
        }
        catch (NumberFormatException e) {
            System.err.println("Invalid commmand-line argument, " +
                "terminating...");
            System.exit(1);
        }
    }

问题是,当我 运行 带有各种 command-line 参数的程序时(即使我传入 1,它应该在 1 秒后结束,我得到的响应没有差异! ), none 其中实际上使条件语句为真,这将中断 msgThread 并在屏幕上打印一条消息:

        // if the amount of time passed is more than patience and the
        // thread is still alive
        if ((System.currentTimeMillis() - startTime > patience) &&
            msgThread.isAlive()) {

            // "tired of waiting" to threadMessage
            threadMessage("Tired of waiting, ending thread.");
            // interrupt the thread
            msgThread.interrupt();
            // wait indefinitely for it to finish
            msgThread.join();
        }

这是我 运行 使用 1 秒 command-line 参数时的控制台输出示例:

这是代码的完整副本,如果能帮助理解这些结果,我们将不胜感激!

/*
*   This program is from Chapter 13 of "The Java Tutorial". It demonstrates
*   some basic Thread funtionality by displaying 4 different messages
*   4 seconds apart in one Thread, while the other thread periodically
*   checks the total run time of the application to see if it has passed
*   a patience threshold, which is hard-coded as 1 hour but can be 
*   input by the user as a commmand-line arg in seconds. If the patience
*   threshold is reached, the main thread interrupts the message thread
*   and displays "finally!"
*/

public class SimpleThreads {
    /* 
    *  Display a message preceded by the name of the current thread.
    *  This will be called periodically throughout the program to
    *  show where we are in the app
    */
    public static void threadMessage(String message) {
        String threadName = Thread.currentThread().getName();
        System.out.format("%s: %s%n", threadName, message);
    }

    /*
    *   Private nested class that will be the Runnable object. The
    *   run() method will be called when a Thread starts execution.
    */
    private static class MessageLoop implements Runnable {
        /*
        *   Prints a message to the console every four seconds.
        *   There are 4 messages total. If interrupted, says so!.
        */
        @Override
        public void run() {
            String[] message = {"msg1", "msg2", "msg3", "msg4"};
            try {
                for (int i = 0; i < message.length; i++) {
                    Thread.sleep(4000); // throws exception if interrupted
                    threadMessage(message[i]);
                }
            }
            catch (InterruptedException e) {
                threadMessage("I wasn't done!");
            }
        }
    }

    /*
    *   Gets the amount of time (patience) that the user will wait for the
    *   MessageLoop classes thread to complete. Starts the MessageLoop
    *   Thread and tracks the total time it runs. If it runs more than
    *   the patience allows for, the MessageLoop thread will be 
    *   interrupted.
    */
    public static void main(String[] args) throws InterruptedException {

        long patience = 1000 * 60 * 60; // initially 1 hour of patience

        // if there is a command-line arg
        if (args.length > 0) {
            try {
                // takes command-line arg as seconds
                patience = Long.parseLong(args[0]) * 1000;
            }
            catch (NumberFormatException e) {
                System.err.println("Invalid commmand-line argument, " +
                    "terminating...");
                System.exit(1);
            }
        }

        // pass message "Starting MessageLoop thread" to threadMessage
        threadMessage("Starting MessageLoop");
        // get the currentTimeMillis and set as start time (long)
        long startTime = System.currentTimeMillis();

        // create a new Thread and pass it the MessageLoop runnable
        Thread msgThread = new Thread(new MessageLoop());
        // start the thread
        msgThread.start();

        // pass "Waiting for msglp thread to finish" to threadMessage
        threadMessage("Waiting for MessageLoop to finish...");

        // in a loop determined by if the thread is still alive
        while (msgThread.isAlive())

            // wait a max of 1 second for thread to finish
            msgThread.join(1000);

            // if the amount of time passed is more than patience and the
            // thread is still alive
            if ((System.currentTimeMillis() - startTime > patience) &&
                msgThread.isAlive()) {

                // "tired of waiting" to threadMessage
                threadMessage("Tired of waiting, ending thread.");
                // interrupt the thread
                msgThread.interrupt();
                // wait indefinitely for it to finish
                msgThread.join();
            }

        // "finally" to threadMessage
        threadMessage("Finally!");
    }
}
   while (msgThread.isAlive()) msgThread.join(1000);

您可能过了一会儿忘记输入 {。 现在你要等到线程结束,不管怎样。

尝试:

    // in a loop determined by if the thread is still alive
    while (msgThread.isAlive()) {

        // wait a max of 1 second for thread to finish
        msgThread.join(1000);

        // if the amount of time passed is more than patience and the
        // thread is still alive
        if ((System.currentTimeMillis() - startTime > patience) &&
            msgThread.isAlive()) {

            // "tired of waiting" to threadMessage
            threadMessage("Tired of waiting, ending thread.");
            // interrupt the thread
            msgThread.interrupt();
            // wait indefinitely for it to finish
            msgThread.join();
        }
    }