Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
WF-1000X M6 è la sesta generazione di auricolare in-ear sviluppata da Sony, un prodotto che punta a coniugare facilità di utilizzo con una elevata qualità di riproduzione dei contenuti audio e una cura nella riduzione del rumore ambientale che sia da riferimento
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-12-2006, 12:54   #1
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
"eventi" (di sincronizzazione) in Java

in un programma Java ho un certo numero di threads che devono bloccarsi in attesa che si verifichi un certo evento; questo evento dovrebbe essere provocato da un altro thread che subito dopo dovrebbe risvegliare tutti gli altri.

in altre parole dovrei realizzare in Java un meccanismo come gli eventi di Win32.

stavo pensando di utilizzare come oggetto che rappresenta l'evento (stavolta inteso come meccanismo di sincronizzazione) un generico Object: i thread si bloccano con la wait e il thread che provoca l'evento li sblocca con notifyAll. è una cavolata o ha senso?

un po' di pseudocodice:
Codice:
private Object event;

.
.
.

<metodo chiamato dal thread che attende>
while (!<condizione che termina definitivamente l'attesa>) {
	try {
		event.wait();
	}
	catch (InterruptedException e) {
	}
}

.
.
.

<metodo chiamato dal thread che provoca l'evento>
event.notifyAll();
aggiungo che tutto il meccanismo deve verificarsi più volte. vi pare corretto? devo forse richiamare un'altra volta notify o notifyAll subito dopo che il thread che attende è uscito dalla wait?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 13:10   #2
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Ciao, tempo fa aprii un thread simile, guarda se ti può tornare utile
http://www.hwupgrade.it/forum/showthread.php?t=1249755
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 16:47   #3
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
mmmm..
al java day di due sabati fa hanno postato un interessante esempiuccio ke utilizzava le variabili di tipo volatile per mantenere la coerenza tra + thread...
spè ke ti trovo il codice
Codice:
class MyThread extends Thread {
public void run() {
while (!done) { // fai qualcosa ... }
}
public void setDone() { done = true; }
private volatile boolean done;
}
prova così
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 16:49   #4
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
dimenticavo..
le volatile non garantiscono l'atomicità...
Per l'atomicità dovresti usare il tipo java.util.concurrency.Atomic o qualcosa del genere
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 16:58   #5
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
è, ho capito ma sti thread non devono mica spremere la CPU, si devono bloccare

MEMon, ho leggiucchiato il thread che mi hai linkato ma non riesco a capacitarmi: possibile che una cosa simile si debba implementare per forza con tutto quel codice? O_O

io volevo una cosa semplice semplice, non ditemi che devo scrivermi la mia classe Event

il mio codice funzica? ovviamente no, visto che non ho capito un cacchio dei monitor; perché non funzica? fatemi capire
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 17:22   #6
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da 71104
è, ho capito ma sti thread non devono mica spremere la CPU, si devono bloccare

MEMon, ho leggiucchiato il thread che mi hai linkato ma non riesco a capacitarmi: possibile che una cosa simile si debba implementare per forza con tutto quel codice? O_O

io volevo una cosa semplice semplice, non ditemi che devo scrivermi la mia classe Event

il mio codice funzica? ovviamente no, visto che non ho capito un cacchio dei monitor; perché non funzica? fatemi capire
non funziona xkè ti lancerebe l'eccezione ke stai sbloccando un monitor da un oggetto ke non è l'owner del monitor..
e c'ha anke ragione direi
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 17:34   #7
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Lo pseudo codice di 71104 non fa una piega. Probabilmente si tratta solo di un dettaglio mancante. Non ricordo il contesto del thread segnalato da Memon ma non è necessario ingrufolarsi in milione di linee per tradurre quello pseudocodice in Java.

Noterei come ci sia una corrispondenza praticamente diretta tra le intenzioni espresse e la forma in cui sono traducibili.

Codice:
import java.util.concurrent.*;
import java.util.concurrent.locks.*;
import java.util.*;

public class Main {
	private final Lock signalLock = new ReentrantLock();
	private final Condition signalCondition = signalLock.newCondition();

	public void waitForSignal() {
		try {
			signalLock.lock();
			signalCondition.await();
		} catch(InterruptedException ex) {
			
		} finally {
			signalLock.unlock();
		}
	}

	public void signal() {
		try {
			signalLock.lock();
			signalCondition.signalAll();
		} finally {
			signalLock.unlock();
		}
	}

	public static void main(String[] args) {
		final Main  main = new Main();
		Runnable stuntTask = new Runnable() {
			public void run() {
				main.waitForSignal(); //qui i thread si spantegano sulla barriera
				System.out.println(Thread.currentThread().getName() + " free!!!!");
			}
		};
		for(int i = 0; i < 10; i++) {
			new Thread(stuntTask, "StuntThread n. " + i).start();
		}

		System.out.println("Press enter to release stuntthreads...");
		Scanner in = new Scanner(System.in);
		in.nextLine();
		main.signal(); //e qui vengono aperte le porte
	}
}
La parte non evidenziata è "tanto per prova'".
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 17:40   #8
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
eh bhè..
questo mi sa ke funziona..
ma non stai usando wait e notifyAll stai usando i costrutti di java 5
il codice scritto da 71104 avrebbe lanciato un'eccezione xkè ank'io l'ho scritto un migliaio di volte masokisticamente senza imparare mai
il wait e notifyAll danno quel problema perchè un monitor bloccato su un oggetto può essere sbloccato solo dall'owner del monitor (ke mi sa ke è l'oggetto stesso se non erro).
Cmq non lo so spiegare bene dato ke ho le idee un pò confuse anch'io su wait e notify.
Molto ma molto meglio utilizzare i costrutti ad alto livello forniti da java.util.concurrent
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 17:46   #9
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
volatile dalla 1.5 in funziona "in tutto e per tutto".

Codice:
volatile String pippo = "p";

public void asd()
{
     a();
     String c = pippo+"a";
     b();

}
dalla 1.5 in poi è garantito che String c = pippo+"a"; viene eseguita dopo a(); e prima di b();


prima della 1.5 invece c'erano dei buchi...(letto tutto su un jsr)
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 17:51   #10
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da thebol
volatile dalla 1.5 in funziona "in tutto e per tutto".

Codice:
volatile String pippo = "p";

public void asd()
{
     a();
     String c = pippo+"a";
     b();

}
dalla 1.5 in poi è garantito che String c = pippo+"a"; viene eseguita dopo a(); e prima di b();


prima della 1.5 invece c'erano dei buchi...(letto tutto su un jsr)
+ ke altro non era garantito il funzionamento in tutte le implementazioni delle virtual machine.
Questo perchè le specifiche del memory model di java erano troppo lacunose e davano adito a diverse interpretazioni, e soprattutto alcuni costrutti utilizzati per migliorare le performance della gestione dei thread dovevano x forza di cose "violare" le specifiche (se si può dire violare x una specifica non ben definita)
Invece dalla versione 5 in poi è stata definita correttamente la relazione di Happens Before x il memory model e sono state aggiornate le specifiche in maniera congruente, cosikkè tutte le impliementazioni ke seguono le specifiche di java 5 non danno + alcun problema con il multi-threading (non che prima ne dessero x forza...ma diciamo che andava un pò a culo a seconda dell'implementazione )
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 18:02   #11
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
L'intuizione di Tigershark è corretta.

Il linguaggio stabilisce che l'invocazione di wait e notify deve avvenire in condizione di possesso esclusivo, parte del Thread che esegue l'invocazione, del monitor associato all'istanza che possiede i metodi wait o notify invocati.

In Java tale possesso esclusivo è garantito nel caso in cui l'accesso avvenga all'interno di un blocco sincronizzato sull'oggetto a cui appartiene il metodo wait/notify invocato o all'interno di un metodo sinchronized nel caso in cui l'oggetto in questione sia "this".

Cioè sincronizzi, sull'oggetto X, per escludere che qualche altro Thread possa mettere le mani sul monitor associato a X, mentre invochi wait o notify su X.

Non fatico ad immaginare che dietro tale regola vi sia qualche necessità strutturale. Ma per quello che interessa a noi basta e avanza che sia la lingua ad imporlo.

[AGGIUNTO]

P.s.: mi riferivo al wait e al notify, non al volatile.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 21:04   #12
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da PGI-Bis
L'intuizione di Tigershark è corretta.
infatti l'eccezione me la lancia, a essere errato il mio codice era errato

dunque per capirci
se io volessi realizzare una mia classe Event in questa forma:
Codice:
class Event
{
	public void myWait()  // può essere chiamato da qualsiasi thread in qualsiasi momento
	{
		...
	}

	public void myNotifyAll()  // idem come sopra
	{
		...
	}
}
come dovrei implementare i metodi myWait e myNotifyAll nella maniera più semplice possibile?

vanno bene i metodi waitForSignal e signal dell'esempio di PGI-Bis? cioè devo usare come minimo due oggetti (un ReentrantLock e una Condition)?

a me pare assurdo che una perla come Java abbia una tale carenza
in Win32 è sufficiente aprire un solo HANDLE e si ha un meccanismo notevolmente versatile

mah
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 21:06   #13
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
a proposito, non è che tante volte in Java 6 c'è una bella classe EventEspeciallyMadeFor71104 già pronta?

no perché io ho già 2 buoni motivi per passare a Java 6 (di cui uno addirittura ottimo), e questo non sarebbe altro che il terzo
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 21:13   #14
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
ah, dimenticavo: sempre facendo riferimento al confronto con Win32, l'esempio di PGI-Bis NON è "manual reset", giusto?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 21:17   #15
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da 71104
infatti l'eccezione me la lancia, a essere errato il mio codice era errato

dunque per capirci
se io volessi realizzare una mia classe Event in questa forma:
Codice:
class Event
{
	public void myWait()  // può essere chiamato da qualsiasi thread in qualsiasi momento
	{
		...
	}

	public void myNotifyAll()  // idem come sopra
	{
		...
	}
}
come dovrei implementare i metodi myWait e myNotifyAll nella maniera più semplice possibile?

vanno bene i metodi waitForSignal e signal dell'esempio di PGI-Bis? cioè devo usare come minimo due oggetti (un ReentrantLock e una Condition)?

a me pare assurdo che una perla come Java abbia una tale carenza
in Win32 è sufficiente aprire un solo HANDLE e si ha un meccanismo notevolmente versatile

mah
ma perchè il mio scheletro di codicillo non ti piaceva?
guarda se scritto ks ti piace di +
Codice:
public class ProvaThread {
volatile boolean condition = false;
	public ProvaThread() {
		while(condition) {
			//do something;
		}
	}
	
	public void myNotify() {
		condition = true;
	}
	
	public void myWait() {
		condition=false;
	}
}
Se non ho invertito il significato di wait e notify dovrebbe andare
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 21:19   #16
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
mmmmm..
ora ho capito ke intendevi
e mi sa ke il mio codice non va bene xkè comunque aspetta di finire quello ke sta facendo nel ciclo e non si ferma immediatamente
boh..
dai un okkiata a java.util.concurrent e vedi se c'è qualco'altro ke fa al caso tuo
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 21:29   #17
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da ^TiGeRShArK^
ma perchè il mio scheletro di codicillo non ti piaceva?
è che non va bene perché il while succhia CPU; io volevo bloccarmi nell'attesa...
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 21:36   #18
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da 71104
è che non va bene perché il while succhia CPU; io volevo bloccarmi nell'attesa...
ahhh..
e bhè?
ke problema c'è?
diamonds non ti ha insegnato niente?
un bel Thread.sleep(1) dentro il while e il problema è risolto..
e se vedi ke succhia ancora cpu mettigli 2, 3 o quello ke ti pare
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 21:43   #19
cisc
Senior Member
 
L'Avatar di cisc
 
Iscritto dal: Nov 2002
Città: Cosenza --> Roma
Messaggi: 853
che ne diti della comoda CyclicBarrier
presente in java 5.0
__________________
GNU MyServer Wants YOU!!
We live thinking we will never die. We die thinking we had never lived. Jason Becker
cisc è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2006, 21:58   #20
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Quote:
Originariamente inviato da 71104
infatti l'eccezione me la lancia, a essere errato il mio codice era errato

dunque per capirci
se io volessi realizzare una mia classe Event in questa forma [OMISSIS]
come dovrei implementare i metodi myWait e myNotifyAll nella maniera più semplice possibile
Sarebbe:

Codice:
public class Event {
	private boolean wakeup;

	public synchronized void myWait() {
		try {
			while(!wakeup) {
				wait();
			}
		} catch(InterruptedException ex) {
			return;
		}
	}

	public synchronized void myNotifyAll() {
		wakeup = true;
		notifyAll();
	}
}
Per usare una barriera deve avere una soglia, cioè deve conoscere in anticipo il numero di Thread che devono raggiungere la barriera prima che questa liberi i Thread.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Artemis II: nuovo test prima del Wet Dre...
GTA 6 gratis se nasce un figlio il giorn...
Quasi la metà degli smartphone at...
DDR5 a 16 dollari al gigabyte: Framework...
Meno di 3kg per 'diventare' bionici: l'u...
Al regalo di San Valentino ci pensa HUAW...
Intel multata in India: 30 milioni di do...
Beast of Reincarnation ha una data di us...
Provati Reno15 e Reno15 FS: analisi comp...
L'Europa sfida la Cina sul litio: in Fin...
Sono 32, di cui 6 nuove, le offerte Amaz...
Rinnovo dei coupon Amazon nascosti: ecco...
Corsair aggiorna la confezione delle RAM...
Ecco tutti i robot aspirapolvere in offe...
Tachyum: dal processore universale alle ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 04:42.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v