Sto solo avendo difficoltà a capire concetto alla base di mettere wait() nella classe di oggetti Per questo amor domande considerare come se wait() e notifyAll() sono in classe thread
nel linguaggio Java, è wait()
su una particolare istanza di un Object
- un monitor assegnato a tale oggetto per essere precisi. Se si desidera inviare un segnale a un thread che è in attesa su quella specifica istanza dell'oggetto, si chiama notify()
su tale oggetto. Se si desidera inviare un segnale a tutti i thread che sono in attesa su tale istanza dell'oggetto, si utilizza notifyAll()
su tale oggetto.
Se wait()
e notify()
erano sullo Thread
, invece, ogni thread avrebbe dovuto conoscere lo stato di ogni altro thread. In che modo thread1 sa che thread2 stava aspettando l'accesso a una particolare risorsa? Se thread1 avesse bisogno di chiamare thread2.notify()
, avrebbe dovuto in qualche modo scoprire che thread2
era in attesa. Dovrebbe esserci un meccanismo per i thread per registrare le risorse o le azioni di cui hanno bisogno in modo che altri possano segnalarli quando le cose sono pronte o disponibili.
In Java, l'oggetto stesso è l'entità condivisa tra thread che consente loro di comunicare tra loro. I thread non hanno conoscenze specifiche l'uno dell'altro e possono essere eseguiti in modo asincrono. Corrono e si bloccano, aspettano e notificano l'oggetto a cui desiderano accedere. Non hanno conoscenza di altri thread e non hanno bisogno di conoscere il loro stato.Non hanno bisogno di sapere che è thread2 che sta aspettando la risorsa - si limitano a notificare sulla risorsa e chiunque sia in attesa (se qualcuno) verrà avvisato.
In Java, utilizziamo quindi oggetti di blocco come sincronizzazione, mutex e punti di comunicazione tra i thread. Ci sincronizziamo su un oggetto lock per ottenere l'accesso mutex a un importante blocco di codice e per sincronizzare la memoria. Aspettiamo un oggetto se stiamo aspettando che alcune condizioni cambino: alcune risorse diventano disponibili. Informiamo su un oggetto se vogliamo risvegliare i fili dormiente.
// locks should be final objects so the object instance we are synchronizing on,
// never changes
private final Object lock = new Object();
...
// ensure that the thread has a mutex lock on some key code
synchronized (lock) {
...
// i need to wait for other threads to finish with some resource
// this releases the lock and waits on the associated monitor
lock.wait();
...
// i need to signal another thread that some state has changed and they can
// awake and continue to run
lock.notify();
}
Ci può essere un numero qualsiasi di oggetti di blocco nel programma, ognuno dei quali blocca una particolare risorsa o segmento di codice. Potresti avere 100 oggetti di blocco e solo 4 thread. Poiché i thread eseguono le varie parti del programma, ottengono l'accesso esclusivo a uno degli oggetti di blocco. Di nuovo, non devono conoscere lo stato di esecuzione degli altri thread.
Ciò consente di aumentare o diminuire il numero di thread in esecuzione nel software quanto si desidera. Si scopre che i 4 thread stanno bloccando troppo le risorse esterne, quindi è possibile aumentare il numero. Spingendo troppo il server danneggiato, riduci il numero di thread in esecuzione. Gli oggetti lock assicurano mutex e la comunicazione tra i thread indipendentemente dal numero di thread in esecuzione.
È difficile capire cosa stai chiedendo ... – assylias
ti sto chiedendo se abbiamo messo in attesa e notificato nella classe Thread quindi penso che questo codice avrebbe funzionato. – Sunny
'.wait()' e '.notify {, Tutti}()' si trovano su 'Object', non' Thread'. Questo è ciò che consente l'implementazione di molte primitive di blocco nella JVM ('Semaforo',' CountDownLatch', ecc.) – fge