0

Here is a code in which I am confused at some areas.

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

The part that I need explanation is long patience = 1000 * 60 * 60;

What is the purpose of patience here? And on the part of the code shown below I think it is getting another value depending of the condition. right? If so how do we get the command line argument (i.e 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); } } } 
2
  • Patience is 1000 (1 sec) * 60 (sec) * 60 (sec in a minute), so the first line is 1 minute in miliseconds, but, if the program is runned with a parameter (args.length > 0), it use the first parameter (args[0]) as the time to sleep (patience). Commented Dec 31, 2014 at 13:52
  • actually @AVolpe it is 1000ms (1 sec) * 60 (seconds) * (60 minutes) = 1 hour. Commented Dec 31, 2014 at 14:19

1 Answer 1

2

You are using patience variable in here:

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

Now System.currentTimeMillis() returns you current time in milli seconds. And you defined patience as

long patience = 1000 * 60 * 60; 

And assuming your args[0] you passed as 1, you get final patience as 3600000 which resembles an hour i.e. 60 mins * 60 secs * 1000 millis

So if you reach that if block within one hour and thread is alive, then you wait for thread to complete indefinitely as condition above satisfies using join thread api.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.