java:concurrency_intro

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
java:concurrency_intro [2015/03/24 13:50]
gthanos [Περιμένοντας ένα νήμα να ολοκληρώσει μέσω της μεθόδου join()]
java:concurrency_intro [2015/04/18 15:57]
gthanos [Εφαρμόζοντας τις μεθόδους sleep()/interrupt()/join() σε ένα παράδειγμα]
Line 87: Line 87:
 </​code>​ </​code>​
  
-Εάν ένα νήμα δεν καλεί κάποια μέθοδο που δημιουργεί [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​lang/​InterruptedException.html|InterruptedException]] θα πρέπει περιοδικά να ελέγχει κατά πόσο υπάρχει κάποια σήμα διακοπής προς το συγκεκριμένο νήμα σε μία ανακύκλωση της μορφής+Εάν ένα νήμα δεν καλεί κάποια μέθοδο που δημιουργεί [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​lang/​InterruptedException.html|InterruptedException]] ​και η εφαρμογή δουλεύει με interrupts, ​θα πρέπει περιοδικά να ελέγχει κατά πόσο υπάρχει κάποια σήμα διακοπής προς το συγκεκριμένο νήμα σε μία ανακύκλωση της μορφής
  
 <code java> <code java>
Line 112: Line 112:
 </​code>​ </​code>​
  
-τότε η εκτέλεση του σταματάει έως ότου το νήμα '​t'​ να τερματίσει την εκτέλεση του. Υπάρχουν οι εξής παραλλαγές της μεθόδου join+τότε η εκτέλεση του σταματάει έως ότου το νήμα ​**'​t'​** να τερματίσει την εκτέλεση του. Υπάρχουν οι εξής παραλλαγές της μεθόδου join
   * **t.join():​** περίμενε μέχρι το νήμα t να τερματίσει   * **t.join():​** περίμενε μέχρι το νήμα t να τερματίσει
   * **t.join(long millis):** μέχρι το νήμα t να τερματίσει ή περίμενε για **millis** milliseconds.   * **t.join(long millis):** μέχρι το νήμα t να τερματίσει ή περίμενε για **millis** milliseconds.
   * **t.join(long millis, int nanos):** μέχρι το νήμα t να τερματίσει ή περίμενε για **millis+nanos/​1000000** milliseconds.   * **t.join(long millis, int nanos):** μέχρι το νήμα t να τερματίσει ή περίμενε για **millis+nanos/​1000000** milliseconds.
  
-Όπως και η μέθοδος sleep() η μέθοδος join() δύναται να διακοπεί από ένα InterruptedException().+Όπως και η μέθοδος ​**sleep()** η μέθοδος ​**join()** δύναται να διακοπεί από ένα ​[[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​lang/​InterruptedException.html|InterruptedException()]].
  
 ===== Εφαρμόζοντας τις μεθόδους sleep()/​interrupt()/​join() σε ένα παράδειγμα ===== ===== Εφαρμόζοντας τις μεθόδους sleep()/​interrupt()/​join() σε ένα παράδειγμα =====
  
-Δείτε το παρακάτω παράδειγμα εκτέλεσης δύο νημάτων,​ το οποίο χρησιμοποιεί τις μεθόδους sleep(), interrupt() και join()+Δείτε το παρακάτω παράδειγμα εκτέλεσης δύο νημάτων,​ το οποίο χρησιμοποιεί τις μεθόδους sleep(), interrupt() και join(). Το κεντρικό νήμα (μέθοδος main) περιμένει το νήμα που δημιουργείται για δεδομένο χρονικό διάστημα. Κάθε 1 δευτερόλεπτο το κεντρικό νήμα επιστρέφει από την μέθοδο **join(1000)** και εξετάζει εάν a)ο χρόνος εκτέλεσης του ολοκληρώθηκε και b) το παιδί τελείωσε μέσω της **t.isAlive()**. Εάν ισχύουν και οι δύο παραπάνω προϋποθέσεις τότε στέλνει ένα interrupt στο παιδί και περιμένει να τερματίσει. 
 + 
 +<code java MessageLoops.java>​ 
 +public 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 
 +        SimpleThreads.threadMessage(importantInfo[i]);​ 
 +      } 
 +    } catch (InterruptedException e) { 
 +      SimpleThreads.threadMessage("​I wasn't done!"​);​ 
 +    } 
 +  } 
 +
 +</​code>​
  
 <code java SimpleThreads.java>​ <code java SimpleThreads.java>​
 public class SimpleThreads { public class SimpleThreads {
  
-    ​// Display a message, preceded by +  ​// Display a message, preceded by 
-    // the name of the current thread +  // the name of the current thread 
-    static void threadMessage(String message) { +  ​public ​static void threadMessage(String message) { 
-        String threadName = +    String threadName = 
-            Thread.currentThread().getName();​ +      Thread.currentThread().getName();​ 
-        System.out.format("​%s:​ %s%n",​ +    System.out.format("​%s:​ %s%n",​ 
-                          threadName,​ +              threadName,​ 
-                          message); +              message); 
-    }+   
  
-    private ​static ​class MessageLoop +  public ​static void main(String ​args[]) 
-        implements Runnable { +    ​throws ​InterruptedException {
-        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[]+    ​// Delay, in milliseconds before 
-        ​throws InterruptedException {+    // we interrupt MessageLoop 
 +    // thread ​(default one hour). 
 +    long patience = 1000 * 60 * 60;
  
-        ​// Delay, in milliseconds before +    ​// If command line argument 
-        // we interrupt MessageLoop +    // present, gives patience 
-        // thread ​(default one hour)+    // in seconds. 
-        ​long patience = 1000 60 * 60;+    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 command line argument +    threadMessage("​Starting MessageLoop thread"​); 
-        // present, gives patience +    long startTime ​System.currentTimeMillis(); 
-        // in seconds. +    ​Thread t = new Thread(new MessageLoop()); 
-        if (args.length > 0{ +    t.start();
-            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"​);​ +    ​threadMessage("​Waiting for MessageLoop thread to finish"​);​ 
-        long startTime = System.currentTimeMillis();​ +    // loop until MessageLoop 
-        Thread t = new Thread(new MessageLoop());​ +    // thread exits 
-        t.start();​ +    while (t.isAlive()) { 
- +      threadMessage("​Still waiting..."​);​ 
-        ​threadMessage("​Waiting for MessageLoop thread to finish"​);​ +      // Wait maximum of 1 second 
-        // loop until MessageLoop +      // for MessageLoop thread 
-        // thread exits +      // to finish. 
-        while (t.isAlive()) { +      t.join(1000);​ 
-            threadMessage("​Still waiting..."​);​ +      if (((System.currentTimeMillis() - startTime) > patience) 
-            // Wait maximum of 1 second +          && t.isAlive()) { 
-            // for MessageLoop thread +        threadMessage("​Tired of waiting!"​);​ 
-            // to finish. +        t.interrupt();​ 
-            t.join(1000);​ +        // Shouldn'​t be long now 
-            if (((System.currentTimeMillis() - startTime) > patience) +        // -- wait indefinitely 
-                  && t.isAlive()) { +        t.join(); 
-                threadMessage("​Tired of waiting!"​);​ +      }
-                t.interrupt();​ +
-                // Shouldn'​t be long now +
-                // -- wait indefinitely +
-                t.join(); +
-            } +
-        } +
-        threadMessage("​Finally!"​);​+
     }     }
-+    threadMessage("​Finally!"​);​ 
-</​code>​+  ​
 +}</​code>​
  
  
java/concurrency_intro.txt · Last modified: 2016/02/26 11:15 (external edit)