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]].

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