Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    16

    [Java] Thread

    Ho un dubbio, ho fatto un semplice programmino in java che esegue 3 Thread e volevo vedere i vari cambiamenti settando la priorità di ciascun thread.

    ecco il programmino:

    public class ThreadSleep {

    public static void main( String args[] ) {

    PrintThread th1 = new PrintThread( "Thread 1", 6 );
    PrintThread th2 = new PrintThread( "Thread 2", 4 );
    PrintThread th3 = new PrintThread( "Thread 3", 9 );

    System.out.println("Partenza thread");

    th1.start();
    th2.start();
    th3.start();

    System.out.println("Thread partiti, fine main");


    }


    }

    class PrintThread extends Thread {

    private int v_sleep;

    // Costruttore
    public PrintThread( String nome, int p ) {

    super( nome );
    setPriority( p );

    }

    public void run() {


    System.out.println( getName() + ": completato. " + "Priorità: " + getPriority() );

    }

    }
    Non capisco perché il risultato è sempre lo stesso, vengono eseguiti in sequenza e non per ordine di priorità. Qualcuno mi spiega perché?

    Perché poi facendo un programma più complicato dove devo impostare delle priorità non vengono rispettate e non mi funziona bene :-(

    Cmq ecco l'output del programma precedente, come potete vedere prima viene completato il Thread 1 poi il 2 e poi il 3, ma teoricamente la sequenza dovrebbe essere 3, 1 , 2.

    Partenza thread
    Thread 1: completato. Priorità: 6
    Thread 2: completato. Priorità: 4
    Thread partiti, fine main
    Thread 3: completato. Priorità: 9

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Thread

    Originariamente inviato da PepBG
    Non capisco perché il risultato è sempre lo stesso, vengono eseguiti in sequenza e non per ordine di priorità. Qualcuno mi spiega perché?
    Quando si lavora con i thread bisogna prestare molta attenzione, perché non ci sono molte garanzie:

    * Non c'è alcuna garanzia che l'ordine in cui i thread sono stati avviati con start() sia anche lo stesso ordine in cui i thread vengono eseguiti.

    * Non c'è alcuna garanzia che i thread occupino la CPU in modo equo, uniforme o continuo.

    * Non c'è alcuna garanzia sull'ordine in cui i thread con la stessa priorità ïn stato "runnable" sono scelti per passare allo stato di "running".

    * Java definisce 10 livelli di priorità 1...10 ma non c'è alcuna garanzia che una specifica implementazione della JVM recepisca realmente 10 livelli diversi, magari ne gestisce di meno, con la conseguenza che più livelli hanno lo stesso "valore".

    La JVM però usa la priorità in un modo molto importante: se ci sono più thread in stato runnable e uno di questi ha la priorità più alta rispetto agli altri e rispetto al thread in esecuzione, allora quello in esecuzione torna in runnable e quello a priorità più alta passa a running.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    16
    Il problema è che è tutto troppo sequenziale, cioè vengono eseguiti sempre nell'ordine in cui sono creati. Ho provato motli modi e la sequenza è sempre la stessa 1 - 2 - 3

    Se non c'è nessuna garanzia almeno qualche volta dovrebbero cambiare, invece l'output è sempre lo stesso.

    Poi come viene gestita la priorità, si potrebbe creare una posticipazione indefinita visto che qando arriva un thread con una priorità maggiore quello che è in running viene tolto a favore di quello con la priorità maggiore.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da PepBG
    Il problema è che è tutto troppo sequenziale, cioè vengono eseguiti sempre nell'ordine in cui sono creati. Ho provato motli modi e la sequenza è sempre la stessa 1 - 2 - 3
    Sul mio PC Win2000, JDK 6, il tuo programmino stampa:

    codice:
    Partenza thread
    Thread 3: completato. Priorità: 9
    Thread partiti, fine main
    Thread 1: completato. Priorità: 6
    Thread 2: completato. Priorità: 4
    e qualche volta:

    codice:
    Partenza thread
    Thread 1: completato. Priorità: 6
    Thread 2: completato. Priorità: 4
    Thread 3: completato. Priorità: 9
    Thread partiti, fine main
    La questione comunque è che il run dei tuoi thread è troppo breve.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    16
    allora provo a far addormentare i thread per un pò di tempo vediamo che succede.

    Secondo te potrebbe migliorare la cosa?

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    Ho spostato la discussione nel forum dedicato a Java.
    In futuro, poni qui le tue domande relative a questo linguaggio.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.