【问题标题】:how threads work in javajava中线程是如何工作的
【发布时间】:2014-12-31 13:48:27
【问题描述】:

这是我在某些方面感到困惑的代码。

public class SimpleThreads {

    // Display a message, preceded by
    // the name of the current thread
    static void threadMessage(String message) {
        String threadName =
            Thread.currentThread().getName();
        System.out.format("%s: %s%n",
                          threadName,
                          message);
    }

    private static class MessageLoop
        implements Runnable {
        public void run() {
            String importantInfo[] = {
                "Mares eat oats",
                "Does eat oats",
                "Little lambs eat ivy",
                "A kid will eat ivy too"
            };
            try {
                for (int i = 0;
                     i < importantInfo.length;
                     i++) {
                    // Pause for 4 seconds
                    Thread.sleep(4000);
                    // Print a message
                    threadMessage(importantInfo[i]);
                }
            } catch (InterruptedException e) {
                threadMessage("I wasn't done!");
            }
        }
    }

    public static void main(String args[])
        throws InterruptedException {

        // Delay, in milliseconds before
        // we interrupt MessageLoop
        // thread (default one hour).
        long patience = 1000 * 60 * 60;

        // If command line argument
        // present, gives patience
        // in seconds.
        if (args.length > 0) {
            try {
                patience = Long.parseLong(args[0]) * 1000;
            } catch (NumberFormatException e) {
                System.err.println("Argument must be an integer.");
                System.exit(1);
            }
        }

        threadMessage("Starting MessageLoop thread");
        long startTime = System.currentTimeMillis();
        Thread t = new Thread(new MessageLoop());
        t.start();

        threadMessage("Waiting for MessageLoop thread to finish");
        // loop until MessageLoop
        // thread exits
        while (t.isAlive()) {
            threadMessage("Still waiting...");
            // Wait maximum of 1 second
            // for MessageLoop thread
            // to finish.
            t.join(1000);
            if (((System.currentTimeMillis() - startTime) > patience)
                  && t.isAlive()) {
                threadMessage("Tired of waiting!");
                t.interrupt();
                // Shouldn't be long now
                // -- wait indefinitely
                t.join();
            }
        }
        threadMessage("Finally!");
    }
}

我需要解释的部分是 长时间的耐心 = 1000 * 60 * 60;

这里耐心的目的是什么?在下面显示的代码部分,我认为它会根据条件获得另一个值。正确的?如果是这样,我们如何获取命令行参数(即 args[0])?

if (args.length > 0) {
            try {
                patience = Long.parseLong(args[0]) * 1000;
            } catch (NumberFormatException e) {
                System.err.println("Argument must be an integer.");
                System.exit(1);
            }
        }
}

【问题讨论】:

  • 耐心是1000 (1 sec) * 60 (sec) * 60 (sec in a minute),所以第一行是以毫秒为单位的1分钟,但是,如果程序带有参数(args.length &gt; 0)运行,它使用第一个参数(args[0])作为睡觉的时间(耐心)。
  • 实际上@AVolpe 是 1000 毫秒(1 秒)* 60(秒)*(60 分钟)= 1 小时。

标签: java multithreading join


【解决方案1】:

你在这里使用了耐心变量:

if (((System.currentTimeMillis() - startTime) > patience)

现在 System.currentTimeMillis() returns 您当前的时间(以毫秒为单位)。而你将耐心定义为

long patience = 1000 * 60 * 60;

假设您的 args[0] 以 1 的形式通过,您将获得 3600000 的最终耐心,这类似于一个小时,即 60 分钟 * 60 秒 * 1000 毫秒

因此,如果您在一小时内达到如果阻塞并且线程处于活动状态,那么您将无限期地等待线程完成,因为使用连接线程 api 满足上述条件。

【讨论】:

    猜你喜欢
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2014-09-27
    相关资源
    最近更新 更多