Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Il nuovo top di gamma vivo punta su un comparto fotografico particolarmente articolato, con un teleobiettivo da 200 megapixel e teleconvertitori esterni capaci di arrivare a 400 mm equivalenti. Lo abbiamo provato a Tenerife, mettendo alla prova fotocamere, prestazioni, autonomia e accessori. Ecco come si è comportato.
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
Un mondo affollato e vivo, personaggi destinati a sparire a fine test e nessuno a inseguire l'oggetto giusto. Beta e stress test di World of Warcraft: Forever hanno fatto emergere un roleplay spontaneo, tra danze a Goldshire e code ordinate ai PNG
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
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: 12113
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: 12113
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: 12113
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: 12113
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: 12113
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: 12113
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: 12113
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: 12113
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


Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista Recensione vivo X500 Pro Max: la fotografia mobi...
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
RDNA 5 sulle APU AMD, ma non per tutti: ...
Marvell acquisisce Lumentum per 115 mili...
La febbre dei data center fa impennare i...
ECOVACS T90S OMNI crolla a 499€ su Amazo...
In Cina i camion elettrici hanno gi&agra...
Attacchi hacker ai supermercati in Europ...
I datacenter non piacciono? OpenAI prova...
Cupra Raval sfida BMW, Volvo e le altre:...
BYD supera per la prima volta le 300.000...
Crisi RAM, spunta un prezzo incredibile ...
Ginux, un nuovo kernel compatibile con L...
Gemini Notebook si aggiorna: arrivano i ...
Svolta per l'emulazione della prima Xbox...
Narwal celebra 10 anni: l'evoluzione tec...
TIM Enterprise acquisisce il 70% di VoiS...
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: 18:45.


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