Torna indietro   Hardware Upgrade Forum > Software > Programmazione

MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro
MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro
Wireless 2.4 GHz, Bluetooth 5.4, cancellazione attiva del rumore, design pieghevole e un'autonomia che mette in imbarazzo prodotti che costano il doppio. Le Maestro 500 non eccellono in nulla, ma offrono tutto. E a questo prezzo è difficile chiedere di più
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine
Dopo anni di attesa e una lunga fase di sviluppo, Noctua entra nel mercato dei dissipatori a liquido AIO con la nuova serie NL-LC1. Forte dell'esperienza maturata nel raffreddamento ad aria, l'azienda austriaca promette di portare la propria filosofia fatta di qualità costruttiva, attenzione ai dettagli e silenziosità anche in questo segmento. Abbiamo provato il nuovo sistema per scoprire se riesce a distinguersi in un mercato ormai molto competitivo.
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super
Arrivato sul mercato italiano a fine marzo, la serie Boox Go 10.3 (Gen II) offre Android 15, penna da 4096 livelli e retroilluminazione opzionale (nel modello da noi provato, Lumi, presente). La serie si compone di due tablet ePaper che fanno da e-reader, blocco note digitale e persino browser, tutto a un prezzo che fa dimenticare i prodotti di brand più blasonati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-05-2011, 18:18   #1
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2057
[java] domandina sui Thread e sulle interfacce

ciao,

i thread mi son da sempre stati abbastanza antipatici e vorrei cercare di farmeli stare più simpatici

ho un dubbio che spero possiate togliermi

Codice:
class Pesa {
	public static void main(String[] args) {
		int[][] m = {
			{ 1, 2 },
			{},
			{ 1 } };
		Casella c = new Casella();
		int id = 0;
		for (int[] s: m) 
			new MioThread(id++, s, c);
	}
}
MioThread è la classe che estende Thread .
Richiamandola all'interno del for i 3 thread vengono avviati uno dopo l'altro o in concomitanza ? cioè mentre è avviato il primo thread parte il secondo o prima di partire il secondo deve finire il primo ?

altra domandina :

Codice:
((MioThread)Thread.currentThread()).mioId();
MioThread è sempre la classe che estende Thread , ma per usare la funzione currentThread non basta fare Thread.currentThread().mioId() ??? Perchè c'è anche MioThread tra parentesi ?


E ora una domandina sulle interfacce !

mi son sempre chiesto l'utilità delle interfacce , cioè se un'interfaccia contiene solo la dichiarazione dei metodi e nelle classi che la implementano questi metodi vanno definiti che vantaggio c'è ad usarli ? A cosa servono ?


scusate le troppo domande ciao !
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2011, 22:05   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Non farti intimorire, i Thread sono tra gli argomenti più semplici che si possano immaginare. Specialmente da quando ci sono i generici .

Nel codice che hai incollato i thread non sembrano essere avviati, mancherebbe infatti l'invocazione del metodo start.

E' tuttavia possibile che nel costruttore di MioThread tu invochi start() che non è una grandissima idea perché alcune regole del linguaggio Java che riguardano l'inizializzazione dei campi si applicano solo dopo che il costruttore ha terminato l'ultima delle sue istruzioni: l'avvio di un Thread all'interno del costruttore può causare l'esecuzione di codice concomitante alla costruzione. Per capire se effettivamente sia un problema bisogna esaminare il codice nel suo complesso.

Supponendo che il metodo start sia invocato, l'avvio dei thread è sequenziale (partono nell'ordine che puoi desumere dal codice del metodo main). La loro esecuzione, cioè quello che capita nei loro metodi run() è concorrente: i thread sono avviati uno alla volta ma ciò che capita nei loro metodi run capita (potenzialmente) nello stesso momento.

Per farti un esempio concreto della differenza, se avessimo:

Codice:
public class MyThread extends Thread {
    private final int id;

    public MyThread(int id) {
        this.id = id;
        System.out.println(id + " E' STATO GENERATO");
    }

    @Override
    public void run() {
        System.out.println("IO SONO: " + id);
    }
}
Di fronte al main:

Codice:
public static void main(String[] args) {
    for (int i = 0; i < 3; i++) {
        MyThread t = new MyThread(i);
        t.start();
    }
}
Potremmo dire, in forza di una specifica norma del linguaggio di programmazione Java (l'effetto visibile di azioni intra-thread è quello risultante dall'esecuzione del codice nell'ordine in cui appare nel codice sorgente), che vedremo sempre, sempre, sempre la scritta "0 E' STATO GENERATO" apparire prima di quella "1 E' STATO GENERATO" che apparirà prima di quella "2 E' STATO GENERATO". Nulla potremmo invece dire con certezza dell'ordine reciproco delle scritte "IO SONO: 0", "IO SONO: 1", "IO SONO 2", perché i "run" sono eseguiti in concorso.

Il metodo Thread.currentThread() restituisce il Thread che sta eseguendo il metodo o l'inizializzatore in cui si trova l'invocazione.

Chi sia questo Thread dipenda da tutti fuorché dal metodo in cui ne puoi trovare l'invocazione dal che deduciamo che fare un cast sul suo risultato sia un po' rischioso.

Ad esempio:

Codice:
void metodo() {
    System.out.println(Thread.currentThread());
}
Stamperebbe "pippo" se io dicessi:

Codice:
new Thread("pippo") {
    public void run() {
        metodo();
    }
}.start()
"giovanni" se io dicessi:

Codice:
new Thread("pippo") {
    public void run() {
        metodo();
    }
}.start()
Pippo e Giovanni se io eseguissi entrambi i thread qui sopra.

Per quanto riguarda le interfacce, in Java esistono per permettere l'ereditarietà multipla - cioè la capacità di un tipo di derivare da più di un tipo dei quali almeno uno non derivato dagli altri.
Per ciò che è ereditabile, contengono solo dichiarazioni di metodi perché il fatto di possedere solo le dichiarazioni ma non i corpi esclude la possibilità che si verifichino dei conflitti tra le definizioni di quei metodi. Questi conflitti infatti non possono che essere risolti con regole arbitrarie.

Esempio in python:

Codice:
class A:
	def stampa(self):
		print("A")

class B:
	def stampa(self):
		print("B")

class C(A, B):
	pass

a = C()
a.stampa()
Capita che non ci sia una ragione per cui stampare A sia più logico che stampare B quindi la cosa si risolve imponendo una regola a caso e via.

Se lasci la firma ma togli il corpo non c'è alcuna regola da applicare: chi eredita eredita il metodo e dovrà dire nel suo corpo cosa voglia fare oppure avrà il corpo dell'unica superclasse da cui può derivare.

Dunque interfacce = ereditarietà multipla, solo le firme dei metodi (e quindi non derivazione multipla) perché così non occorre introdurre una regola ad hoc per la risoluzione dell'implementazione del metodo che sarà concretamente invocato.

Questo per quanto riguarda le tecnicalità.

Per l'altro aspetto delle interfacce, cioè quello per cui chi le implementa dichiara di essere compatibile con il tipo dell'interfaccia, valgono le stesse considerazioni che valgono per le classi.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2011, 12:02   #3
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2057
grazie per la risposta sei stato molto gentile e chiaro

il dubbio sui thread è svanito ora

sulle interfacce devo rileggere il tutto un pò meglio in quanto ho letto abbastanza di corsa

ma la domanda è :

se implemento un interfaccia devo definire e implementare tutte le classi dell'interfaccia che andrò ad usare giusto ? allora non era la stessa cosa se definivo ed usavo quella determinata classe senza implementare l'interfaccia ?
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2011, 14:58   #4
jappilas
Senior Member
 
L'Avatar di jappilas
 
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4747
Quote:
Originariamente inviato da aeroxr1 Guarda i messaggi
<...>
se implemento un interfaccia devo definire e implementare tutte le classi dell'interfaccia che andrò ad usare giusto ?
per ogni classe che implementa l' interfaccia dovrai scrivere i metodi che costituiscono quell' interfaccia...
Quote:
allora non era la stessa cosa se definivo ed usavo quella determinata classe senza implementare l'interfaccia ?
non proprio
oltre che nel rendere possibile l' ereditarietà multipla come giustamente diceva PGI-Bis, l' utilità dell' interfaccia sta nei casi in cui si faccia uso del polimorfismo
quando cioè tu abbia degli oggetti che da una parte ridefiniscano il comportamento di metodi presenti nella classe (base) da cui derivano, ma dall' altra siano usati dal restante codice come istanze della stessa classe base - in questo senso puoi pensare un' interfaccia (che in pratica non è altro che una classe avente metodi tutti virtuali puri) come un contratto, tra il codice di un oggetto che svolge determinate funzionalità e il codice che necessita di quelle funzionalità (ma non necessariamente di sapere "chi" li sta implementando in quel momento, a patto che siano definiti correttamente e il contratto sia rispettato)
ti faccio due esempi...
in un gioco come poteva essere Diamonds (rip) puoi avere degli oggetti sul campo di gioco (in quel caso gemme normali, gemme "tiled", bauletti) aventi comportamenti differenziati (come sprite generati in modi diversi o animati a differenti intervalli, ma anche e soprattutto diverse reazioni ai metodi crush() o transform() per realizzare la meccanica di gioco) ma anche richiedenti parecchia funzionalità comune (interazione con la griglia e tra loro stesse, ecc)
in questo caso conviene avere una classe base che implementi quest' ultima E esponga dei metodi che sicuramente verranno ridefiniti per ogni classe derivata - e infatti avevamo Chest, Gem, BigGem ecc che specializzavano AbstractDroppable (che implementava Droppable)
oppure puoi ad esempio realizzare un menu incapsulando il codice corrispondente alle varie opzioni in altrettante implementazioni di uno stesso metodo
Codice:
void execute(RunLoop loop)
, in altrettanti oggetti che istanzierai per poi invocare quello appropriato, cosa che migliora sia la leggibilità sia (per esecuzioni ripetute) l' efficienza rispetto a switch e if chain... e infatti avevamo una lista di istanze di NetPlay, Options, Quit, ecc implementanti l' interfaccia MenuAction, e un
Codice:
selectedMenuAction.execute(this);
(dove il this era l' oggetto menuLoop corrente, che così l' oggetto action poteva far terminare o meno a sua discrezione)
discorso analogo per la macchina a stati del gioco, dove l' interfaccia GridControllerState era costituita dal metodo
Codice:
GridControllerState update(Grid grid, ScoreCalculator scoreCalculator)
e ad ogni ciclo veniva eseguito
Codice:
currentState = currentState.update(...);
__________________
Jappilas is a character created by a friend for his own comic - I feel honored he allowed me to bear his name
Saber's true name belongs to myth - a Heroic Soul out of legends, fighting in our time to fullfill her only wish
Let her image remind of her story, and of the emotions that flew from my heart when i assisted to her Fate

Ultima modifica di jappilas : 25-05-2011 alle 19:05.
jappilas è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2011, 17:19   #5
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Quote:
Originariamente inviato da aeroxr1 Guarda i messaggi
ma la domanda è :

se implemento un interfaccia devo definire e implementare tutte le classi dell'interfaccia che andrò ad usare giusto ? allora non era la stessa cosa se definivo ed usavo quella determinata classe senza implementare l'interfaccia ?
Sì devi implementare tutti i metodi. La seconda domanda non l'ho capita.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2011, 22:29   #6
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2057
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Sì devi implementare tutti i metodi. La seconda domanda non l'ho capita.
cioè se io nella mia interfaccia x ho :

i
Codice:
nt pippo (int pesche , String pluto)

e nella classe che implementa questa interfaccia devo implementare il metodo pippo facendo :

Codice:
class prova implements interfaccia x
{int pippo (int pesche, String pluto)
{implementazione del metodo}
}
non era la stessa cosa se facevo

Codice:
class prova 
{int pippo (int pesche, String pluto)
{implementazione del metodo}
}
senza implementare l'interfaccia x ?
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2011, 23:25   #7
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Chiarissimo.

Ci sono linguaggi in cui è la stessa cosa - cioè nei quali non useresti l'interfaccia o una superclasse.

Java non è tra questi.

Dal punto di vista del linguaggio, quando una classe Java "extends" un'altra classe o "implements" una o più interfacce, le istanze di quella classe possono essere usate come argomenti delle invocazioni di metodo o costruttore che dichiarano di volere come tipo di argomento uno qualsiasi dei tipi - classi, interfacce - che la classe, direttamente o indirettamente, implementa o estende.

Nell'esempio che fai significa che la "p" di:

prova p = new prova();

può essere, ad esempio, usata come argomento dei metodi che richiedono un tipo "x", un tipo "prova" e un tipo java.lang.Object.

public void unMetodo(prova a)...
public void unMetodo(x a)...
public void unMetodo(java.lang.Object a)...

è un passpartout.

Se la classe prova non implementa l'interfaccia x, pur avendone magari tutti i metodi, non può essere usata come se fosse un tipo di dato x. Ne avrebbe le capacità ma non le manifesta e il compilatore rigetterebbe il tentativo.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2011, 23:29   #8
demos88
Senior Member
 
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
Come ha detto PGI e aggiungo un parere personale:
le interfacce hanno anche un valore "formale" nel definire il comportamento (ovvero i metodi che devono essere forniti) che devono avere determinate classi.
Un esempio banale (non del tutto corretto, ma ha senso)... l'interfaccia ADT (abstract data type) può definire i metodi "inserisci" e "estrai". L'interfaccia ADT sarà poi implementata dalle classi Pila, Catena, Albero... infatti le strutture dati Pila, Catena e Albero prevedono tutte metodi di inserimento ed estrazione, anche se ovviamente i metodi saranno implementati in modo diverso a seconda della struttura. Questo è il significato di implementare una interfaccia: la classe che implementa l'interfaccia "si impegna" a fornire determinate funzionalità, nelle modalità specifiche previste dalla classe.

In realtà ci sono alcuni casi particolari in cui per il compilatore ha senso richiedere che venga implementata una interfaccia, per esempio nel caso dell'interfaccia Serializable. Una classe implementa Serializable (ma di fatto non deve definire nessun metodo particolare) quando si necessita di inserire gli oggetti istanziati da essa in stream. Ma non è il tuo caso...
__________________
CPU Ryzen 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight
demos88 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro MSI Maestro 500 Wireless: ANC e 90 ore di autono...
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine NL-LC1 è il primo dissipatore a liquido A...
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con ...
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming Gigabyte MO32U24 OLED: il 4K a 240Hz su un panne...
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh Recensione realme 16 5G: lo smartphone con Selfi...
Gwynne Shotwell (presidente di SpaceX): ...
ISRO lancerà il primo modulo della stazi...
Lo sfondo animato del tuo PC potrebbe es...
Dopo la RAM. Framework annuncia l'aument...
Google Home Speaker ufficiale: è il prim...
Spotify: i nomi utente stanno per divent...
Il limite vero dei data center AI sono g...
AMD conferma i nuovi Threadripper: Zen 6...
Stop all'ADSL per WindTre: continua la m...
HPE punta sull'IA agentica e dichiara gu...
macOS avvisa quando si incolla un comand...
Everpure ridisegna lo storage per l’IA: ...
NVIDIA RTX Remix 1.5: realizzare remaste...
Come configurare Windows 11 like a pro, ...
Windows 11 cambia finalmente la gestione...
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: 20:00.


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