Προς το περιεχόμενο

Απορια για Threads σε Java


bazinga13

Προτεινόμενες αναρτήσεις

Την καλησπερα μου σε ολους,παιδια το ξερω ειναι χαζο αλλα προσπαθω εδω και ωρα να καταλαβω τις εκτελεσεις του βρογχου μεσα σ ενα Thread.

public class Main extends Thread
{
     
    public static void main(String[] args)
    {
        FooBar f1 = new FooBar("Romeo");
        Thread t1 = new Thread(f1);
        t1.start();
        
        FooBar f2 = new FooBar("Julliet");
        Thread t2 = new Thread(f2);
        t2.start();
    }    
}


class Foo
{
    private String name;
    
    public Foo (String s)
    {
        name = s;
    }
    
    public void setName (String s)
    {
        name = s;
    }
    
    public String getName ()
    {
        return name;
    }
}


class FooBar extends Foo implements Runnable
{

    public FooBar (String s)
    {
        super (s);
    }
    
    
    @Override
    public void run() 
    {
         for (int i = 0; i < 10; i++)
         {
             System.out.println(getName() + (" Hello"));
         }
    }
    
}

Δεν μπορω να καταλαβω τα αποτελεσματα.

Δημιουργουμε ενα αντικειμενο της κλασης FooBar και μετα καλει την μεθοδο run()

Ετσι οπως το εχω εγω στο φτωχο μυαλο μου θα επρεπε να μου εμφανισει 10 φορες στην σειρα το ονομα

Romeo και μετα 10 φορες στην σειρα το Julliet.

Ποια ειναι τα βηματα εκτελεσης?

Το εχω χασει μαλλον...

 

 

 

 

 

 

 

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν ήταν να σου τα εμφανίσει 10 φορές στη σειρά, δε θα υπήρχε λόγος ύπαρξης των threads. Δε θα υπήρχε καμία διαφορά από το να καλέσεις τις αντίστοιχες μεθόδους χωρίς να μπλέξεις Thread πουθενά.   :)

 

Επειδή σου λείπουν πολύ βασικά, δε θα προσπαθήσω να τα εξηγήσω -- πήγαινε σε κάποιο tutorial που εξηγεί όχι πώς αλλά και τι. Περιληπτικά όμως, από τη στιγμή που κάποιο OS thread (μη ψάχνεις αυτή τη στιγμή γιατί το είπα "OS" thread, υπάρχουν και άλλα είδη αλλά όταν λέμε σκέτο thread κατά 99% εννοούμε αυτό) "μπορεί να εκτελεστεί" (αυτό είναι το στάνταρ, υπάρχουν συγκεκριμένα πράγματα που κάνουν ένα thread να μή μπορεί να εκτελεστεί) τότε ανά πάσα στιγμή μπορεί να τρέξει ο κώδικάς του πάνω σε οποιοδήποτε CPU core, πριν ή μετά ή ταυτόχρονα (multicore CPU) από τον κώδικα οποιουδήποτε άλλου thread.

 

Επομένως, αυτό που περιμένεις να δεις είναι 10 φορές "Romeo Hello\r\n" και 10 φορές "Julliet Hello\r\n" τυχαία ανακατεμένα μεταξύ τους. Ο μόνος περιορισμός προκύπτει από το ότι κάθε ένα thread εκτελείται σειριακά, οπότε μπορεί να δεις αυτό:

 

RoJullieoet HHeello\r\no\r\n

 

αλλά δε μπορεί να δεις αυτό

 

JullJ

 

(δε γίνεται να εμφανιστεί δεύτερο J πρωτού ολοκληρωθεί το πρώτο "Julliet Hello")

 

 

ΥΓ: λείπει από το πρόγραμμά σου στο τέλος της main το εξής:

 

t1.join();

t2.join();

  • Like 3
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Φιλε defacer την καλησπερα μου και σ ευχαριστω για τον χρονο σου.Εχω καμια 10αρια pdf ανοιχτα στην κατηγορια των Threads αλλα δεν μπορω να το καταλαβω παροτι εχω διαβασει αρκετα.Υπαρχει λογος γι αυτο και δεν ειναι μονο στον συγκεκριμενο τομεα.

Δεν ξερω αν πρεπει να το αποκαλεσω προβλημα,ιδιαιτεροτητα η οτιδηποτε αλλο αλλα γενικα για να καταλαβω κατι πρεπει να το βρω η να μου το εξηγησουν οπως ακριβως το εχω στο μυαλο μου εγω αλλιως δεν το πιανω η θα το πιασω μετα απο καιρο σε ανυποπτο χρονο και χωρις λογο και αιτια.

Υπαρχουν φορες που μπορω να καταλαβω κατι περιπλοκο γιατι το εχω βρει ετσι οπως ακριβως το ειχα στο μυαλο μου(και οχι λογο ευφυιας :) ) και κατι φαινομενικα "χαζο" να με ταλαιπωρει για μερες.

Αλλα μαλλον εδω αυτα ειναι εξω απο τα νερα της πληφορικης,μαλλον θα χρειαστουμε αλλη ειδικοτητα για να το ερμηνευσουμε :) :)

 

Εδω τωρα εχω πανω απο 2 ωρες που κοιταω την οθονη και προσπαθω να καταλαβω τα βηματα της εκτελεσης και γιατι βγαζει αυτα που βγαζει.

Η μπορει τελικα να μην το εχω κιολας με τον προγραμματισμο,ολα παιζουν.

Οπως και να εχει σ ευχαριστω και παλι

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αφού η εκτέλεση φτάσει στη t1.Start(), θα αρχίσει να εκτελείται η Foobar που γράφει Romeo σε διαφορετικό thread, και θα έχει διαφορετικά βήματα εκτέλεσης αυτό το άλλο thread από το κύριο, και θα τρέχουν ταυτόχρονα τα threads, με το κάθε thread να έχει τα δικά του βήματα εκτέλεσης. Στη συνέχεια το ίδιο θα συμβεί και με τη t2.Start(). To t1 και το t2 τρέχουν ξεχωριστά και ανεξάρτητα το ένα από το άλλο.

 

Πες πως έχεις ένα 3πύρηνο επεξεργαστή. Όταν ξεκινά το πρόγραμμα τρέχει σε ένα thread όπου ξεκινά να εκτελείται η Main. Μόλις δημιουργείς το t1, δημιουργείται άλλο thread, το οποίο ας πούμε ότι το λειτουργικό σύστημα αναθέτει την εκτέλεσή του στο 2ο πυρήνα. Στη συνέχεια, αναθέτει το t2 στο 3ο πυρήνα. Έτσι έχεις τα διαφορετικά threads να τρέχουν ταυτόχρονα. Το κάθε thread εκτελεί τις εντολές της μεθόδου του βήμα βήμα σε διαφορετικό απομωνομένο χώρο όμως από τα υπόλοιπα. Δηλαδή για παράδειγμα όταν η εκτέλεση στο κύριο thread θα έχει φτάσει στη γραμμή

Thread t2 = new Thread(f2);

το t1 ίσως να έχει φτάσει ήδη στη πρώτη εκτέλεση της

System.out.println(getName() + (" Hello"));

Αυτό βέβαια είναι τυχαίο παράδειγμα, μπορεί και η εκτέλεση να είναι κάνα βήμα πάνω, κάνα βήμα κάτω... Σημασία έχει ότι το κάθε thread έχει τα δικά του βήματα εκτέλεσης που τρέχουν ταυτόχρονα αλλά σε διαφορετικό 'περιβάλλον' να το πω έτσι, ανεξάρτητα.

 

Το κάθε thread όμως μπορεί να έχει διαφορετική ταχύτητα για διάφορους λόγους. Για παράδειγμα μπορεί το λειτουργικό σύστημα να έχει 60 threads, και λόγο του ότι οι πυρήνες είναι λιγότεροι, σε έναν πυρήνα να τρέχουν πάνω από ένα thread, και να μοιράζεται ο χρόνος του πυρήνα σε διάφορα threads, και ο αριθμός των threads που τρέχουν σε κάθε πυρήνα να είναι διαφορετικός... Έτσι τα αποτελέσματα θα εμφανιστούν με τυχαίο τρόπο όπως είπε ο @defacer.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Απλά φαντάσου ότι έχεις 2 ξεχωριστούς υπολογιστές και ο κάθε ένας έχει από μία εργασία : Ο ένας εκτελεί το Hallo Romeo και ο άλλος Hallo Juliet. Δεν ξέρεις ποιός από τους 2 θα τελειώσει πρώτος, ούτε και ποιός θα εκτελέσει την επόμενη Hallo.

Θα μου πεις "Μα γιατί να έχω ξεχωριστές εργασίες ανά thread" ; Επειδή θες παράλληλες εργασίες να εκτελούνται ή να μην υπάρχει λόγος να διακοπεί μία εργασία , ενώ θα "επιβλέπεται" κάποια άλλη ίσως.

Παλαιότερα είχα φτιάξει ένα προγραμματάκι σε στυλ άσκησης πιο πολύ, με swing, που προσομοίαζα ένα κλιματιστικό με 3 αισθητήρες θερμοκρασίας. Κάθε αισθητήρας ήταν σε δικό του thread.

 

Ο Bucky ίσως τα λέει καλύτερα από εμένα εδώ :

 

https://www.youtube.com/watch?v=VYN-CBtPNiM

Επεξ/σία από Lanike71
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλημερα σας παιδια και σας ευχαριστω και τους 2 για τις απαντησεις,βοηθανε παρα πολυ,δεν μπορω να πω οτι το καταλαβα τελειως αλλα κατι αρχιζω να βλεπω στον οριζοντα :)

 

Aυτο που με μπερδευει ειναι η συχνοτητα των εκτελεσεων

 

Thread t1 = new Thread(f1);

t1.start();

 

Thread t2 = new Thread(f2);

t2.start();

 

Δεν θα πρεπει να τελειωσει η πρωτη διεργασια για να ξεκινησει η δευτερη?εκει το χανω λιγο

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλημερα σας παιδια και σας ευχαριστω και τους 2 για τις απαντησεις,βοηθανε παρα πολυ,δεν μπορω να πω οτι το καταλαβα τελειως αλλα κατι αρχιζω να βλεπω στον οριζοντα :)

 

Aυτο που με μπερδευει ειναι η συχνοτητα των εκτελεσεων

 

Thread t1 = new Thread(f1);

t1.start();

 

Thread t2 = new Thread(f2);

t2.start();

 

Δεν θα πρεπει να τελειωσει η πρωτη διεργασια για να ξεκινησει η δευτερη?εκει το χανω λιγο

 

Όχι, ξεκινάνε με μία ελάχιστη διαφορά η μία από την άλλη, αλλά μετά εκτυπώνουν σα να είναι 2 διαφορετικές διεργασίες.

 

Το μόνο που μοιράζονται είναι η κονσόλα που εμφανίζονται τα μηνύματα. Αν κάνεις το i < 100, ίσως καταλάβεις πιο καλά.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

Όχι, ξεκινάνε με μία ελάχιστη διαφορά η μία από την άλλη, αλλά μετά εκτυπώνουν σα να είναι 2 διαφορετικές διεργασίες.

 

Το μόνο που μοιράζονται είναι η κονσόλα που εμφανίζονται τα μηνύματα. Αν κάνεις το i < 100, ίσως καταλάβεις πιο καλά.

 

A οποτε γινεται πρωτα αν καταλαβα η κληση της t1.start() εφοσον ειναι πρωτη και κατευθειαν με  ελαχιστη διαφορα οπως ειπες καλειται η t2.start().

Εγω απλα ειχα λανθασμενα την εντυπωση οτι για να κληθει η t2.start(); επρεπε να περιμενει να εκτελεστουν ολα τα βηματα της t1.start();

αλλα οπως ειπε και ο defacer τοτε ποιο το νοημα των Threads.

 

Η κονσολα ειναι που με μπερδεψε διοτι εβλεπα τα 2 αποτελεσματα ανακατωμενα και δεν μπορουσα να καταλαβω το τι και το γιατι.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...