java:concurrency_intro

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Ταυτόχρονος Προγραμματισμός ====== Στον ταυτόχρονο προγραμματισμό, υπάρχουν δύο βασικές μονάδες εκτέλεσης: τις διεργασίες (processes) και τα νήματα (threads). Στη γλώσσα προγραμματισμού Java, ο ταυτόχρονος προγραμματισμός επιτυγχάνεται μέσω της χρήσης νημάτων. Ένα υπολογιστικό σύστημα έχει συνήθως πολλές ενεργές διεργασίες και νήματα. Αυτό ισχύει ακόμη και σε συστήματα που έχουν μόνο έναν πυρήνα στο υλικό τους, και ως εκ τούτου μπορούν να εκτελέσουν μόνο ένα νήμα ή διεργασία σε κάθε χρονική στιγμή. Ο χρόνος επεξεργασίας μεταξύ των διεργασιών και των νημάτων μοιράζεται μέσω του χρονοπρογραμματιστή (scheduler) του λειτουργικού συστήματος. Μία διεργασία έχει αυτόνομο περιβάλλον εκτέλεσης, δηλ έχει την δική της εικονική μνήμη και τις δικές της μεταβλητές. Συχνά οι διεργασίες ταυτίζονται με τα προγράμματα ή τις εφαρμογές, πράγμα που δεν είναι πάντα αληθές καθώς ένα πρόγραμμα μπορεί να είναι αποτέλεσμα περισσότερων διεργασιών οι οποίες επικοινωνούν μεταξύ τους μέσω των διεπαφών επικοινωνίας μεταξύ διεργασιών (Interprocess Communication - IPC) που ορίζει το κάθε λειτουργικό σύστημα. ===== Νήματα ===== Τα νήματα αναφέρονται συχνά και ως lightweight processes. Τόσο οι διεργασίες όσο και τα νήματα παρέχουν ένα περιβάλλον εκτέλεσης, αλλά απαιτούν λιγότερους πόρους κατά την δημιουργία τους σε σχέση με μία διεργασία. Τα νήματα ζουν μέσα στις διεργασίες (κάθε διεργασία έχει τουλάχιστον ένα thread) και μοιράζονται τους πόρους της διεργασίας, δηλαδή την μνήμη και τα αρχεία που έχει ανοίξει η διεργασία. Η πολυνηματική εκτέλεση αποτελεί βασικό χαρακτηριστικό της πλατφόρμας Java. Κάθε εφαρμογή έχει τουλάχιστον ένα νήμα (ή περισσότερα, αν μετρήσουμε και τα νήματα του JVM για κάθε διεργασία). Για τον προγραμματιστή αρχικά υπάρχει μόνο ένα νήμα το οποίο εκτελείται μέσα από τη μέθοδο //main//. Το νήμα αυτό έχει τη δυνατότητα να δημιουργήσει πρόσθετα νήματα, όπως θα δείξουμε στη συνέχεια. ===== Δημιουργία και εκτέλεση νημάτων ===== Υπάρχουν δύο παρεμφερείς τρόποι για την δημιουργία και εκτέλεση ενός νήματος. Και οι δύο παρατίθενται παρακάτω: <code java HelloRunnable.java> public class HelloRunnable implements Runnable { public void run() { System.out.println("Hello from a thread!"); } public static void main(String args[]) { (new Thread(new HelloRunnable())).start(); } } </code> <code java HelloThread.java> public class HelloThread extends Thread { public void run() { System.out.println("Hello from a thread!"); } public static void main(String args[]) { (new HelloThread()).start(); } } </code> Παρατηρείστε ότι και τα δύο παραπάνω παραδείγματα καλούν την μέθοδο [[http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#start()|Thread.start()]]. Από τα δύο το πρώτο είναι πιο γενικό, καθώς δεν απαιτείται η κλάση σας να είναι απόγονος της κλάσης [[http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html|Thread]]. ===== Σταματώντας την εκτέλεση ενός νήματος μέσω της μεθόδου sleep() ===== Η μέθοδος sleep δίνει την δυνατότητα σε ένα νήμα να σταματήσει την εκτέλεση του για ένα συγκεκριμένο χρονικό διάστημα. Κατά το διάστημα αυτό, άλλες διεργασίες ή threads της υφιστάμενης διεργασίες μπορούν να εκτελεστούν. Η χρονική διάρκεια κατά την οποία θα παύσει η εκτέλεση ενός thread μπορεί να μην είναι ακριβώς η χρονική διάρκεια που επιλέξαμε, καθώς ο χρονοπρογραμματισμός των threads εξαρτάται και από το λειτουργικό σύστημα. Δείτε το παρακάτω παράδειγμα κλήσης της μεθόδου sleep() <code java SleepMessages.java> public class SleepMessages { public static void main(String args[]) throws InterruptedException { String importantInfo[] = { "Mares eat oats", "Does eat oats", "Little lambs eat ivy", "A kid will eat ivy too" }; for (int i=0; i<importantInfo.length; i++) { //Pause for 2 seconds Thread.sleep(2000); //Print a message System.out.println(importantInfo[i]); } } } </code> ===== Επανενεργοποίηση ενός νήματος μέσω της μεθόδου interrupt() ===== Μία διακοπή (interrupt) αποτελεί ένδειξη προς την διεργασία να σταματήσει να κάνει αυτό που κάνει και να εκκινήσει κάτι διαφορετικό ή να τερματίσει. Εάν ένα νήμα έχει καλέσει την sleep().

java/concurrency_intro.1427203024.txt.gz · Last modified: 2016/02/26 11:15 (external edit)