gpt4 book ai didi

java - java中线程是如何工作的

转载 作者:行者123 更新时间:2023-12-02 05:06:48 25 4
gpt4 key购买 nike

这是一段代码,我在其中的某些地方感到困惑。

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

最佳答案

您在这里使用耐心变量:

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

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

long patience = 1000 * 60 * 60;

假设你传递的args[0]为1,你得到的最终耐心为3600000,相当于一个小时,即60分钟* 60秒* 1000毫秒

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

关于java - java中线程是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27722029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com