Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente bannato
    Registrato dal
    Sep 2012
    Messaggi
    465

    Effetto multitasking sulla priorità dei thread

    Input:

    codice:
    // This program uses a synchronized block.
    class Callme {
      void call(String msg) {
        System.out.print("[" + msg);
        try {
          Thread.sleep(1000);
        } catch (InterruptedException e) {
          System.out.println("Interrupted");
        }
        System.out.println("]");
      }
    }
    
    class Caller implements Runnable {
      String msg;
      Callme target;
      Thread t;
    
      public Caller(Callme targ, String s) {
        target = targ;
        msg = s;
        t = new Thread(this);
        t.start();
      }
    
      // synchronize calls to call()
      public void run() {
        synchronized(target) { // synchronized block
          target.call(msg);
        }
      }
    }
    
    class Synch1 {
      public static void main(String args[]) {
        Callme target = new Callme();
        Caller ob1 = new Caller(target, "Hello");
        Caller ob2 = new Caller(target, "Synchronized");
        Caller ob3 = new Caller(target, "World");
    
        // wait for threads to end
        try {
          ob1.t.join();
          ob2.t.join();
          ob3.t.join();
        } catch(InterruptedException e) {
          System.out.println("Interrupted");
        }
      }
    }
    Output:

    codice:
    [Synchronized]
    [World]
    [Hello]
    Se su windows 8 e su Eclipse non sto eseguendo nulla di diverso da Synch1 perché le 3 righe sopra si alternano casualmente?


  2. #2
    Salve,

    Anche se sulla tua macchina non c'è niente in esecuzione, devi considerare che quei thread fanno parte di un processo insito nella JVM e partire dal presupposto di "non ho altro in esecuzione" non è propriamente corretto.

    Partiamo per gradi.

    Quando un thread è in esecuzione e viene posto in pausa, con una sleep, lo scheduler libera la CPU per poi assegnarla ad un secondo thread e così via.

    Tuttavia, non c'è un assoluto ordine che ti dica "Ok ora tocca a thread X" se la parità è la stessa. Infatti a parità di Priorità, i thread in stato di Ready sono presi generalmente in ordine di "anzianità" ma capita anche che non sia strettamente così.

    Anche nel momento in cui tu poni una sincronizzazione, e quindi un thread viene eseguito fino alla fine, non hai la certezza assoluta che sulla macchina vengano poi eseguiti in ordine di creazione! Questo perché tu demandi tutto allo scheduler.

    Se tu vuoi una certezza che ci sia un ordine di esecuzione allora devi settare la priorità dei thread in ordine crescente, in questo modo, tutto dovrebbe andare a suo posto e stampare nell'ordine corretto.

  3. #3
    Utente bannato
    Registrato dal
    Sep 2012
    Messaggi
    465
    ok, thanks, problema risolto


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.