为什么这个条件语句永远不会执行?
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();
}
}
我正在研究 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();
}
}