Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA
Al .NEXT 2026 di Chicago, Nutanix ha mostrato quanto sia cambiata: una piattaforma software che gestisce VM, container e carichi di lavoro IA ovunque, dall’on-premise al cloud pubblico. Con un’esecuzione rapidissima sulle partnership e sulla migrazione da VMware
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta
Xiaomi Pad 8 Pro adotta il potente Snapdragon 8 Elite all'interno di un corpo con spessore di soli 5,75 mm e pannello LCD a 144Hz flicker-free, per un tablet che può essere utilizzato con accessori dedicati di altissima qualità. Fra le caratteristiche esclusive, soprattutto per chi intende usarlo con la tastiera ufficiale, c'è la modalità Workstation di HyperOS 3, che trasforma Android in un sistema operativo con interfaccia a finestre
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-12-2006, 11: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, 12: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, 15: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, 15: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, 15: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, 16: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, 16: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, 16: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, 16: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, 16: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, 17: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, 20: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, 20: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, 20: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, 20: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, 20: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, 20: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, 20: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, 20: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, 20: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 INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Ecovacs presenta la gamma 2026: paviment...
Efficienza energetica fino a 2.000 volte...
Lenovo 360: il programma di canale dell'...
Appena 10.000 qubit per rompere la critt...
Analisi dei transistor durante il funzio...
Attacco informatico a Booking.com: espos...
A quattro mesi dal divieto dei social ne...
NVIDIA GeForce RTX 5060 e 5060 Ti: in ar...
Rebellions, Arm e SK Telecom, nuova alle...
Modernizzazione delle app: Red Hat OpenS...
Nel mirino di Google c'è il back ...
PRAGMATA in bundle con GeForce RTX 5000:...
Le novità MOVA per il 2026: robot e impi...
Windows, stop all'attivazione telefonica...
ASUS porta la serie TUF nel formato Mini...
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: 23:40.


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