Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-05-2011, 19: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, 23: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, 13: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, 15:58   #4
jappilas
Senior Member
 
L'Avatar di jappilas
 
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4739
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 20:05.
jappilas è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2011, 18: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, 23: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 26-05-2011, 00: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 26-05-2011, 00: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 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight
demos88 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
iPhone Air 2 in arrivo già nel 20...
Vimeo quasi svuotata: Bending Spoons ann...
Altro che bolla: per Huang l'AI è...
Battlefield 6: la Stagione 2 segner&agra...
Da Sony due nuovi giradischi wireless pe...
Arriva l'addio definitivo di Intel ad Al...
Attacco AI su Google Calendar: Gemini pu...
Renault vuole reintegrare Ampere nel gru...
1Password introduce un nuovo avviso anti...
Windows 11, nuovo bug blocca le app: col...
Tre sistemi operativi in uno smartphone:...
Crypto in Italia: 2,8 milioni di possess...
Pubblicato 'il carattere' di Claude: uti...
Siri cambia volto su iOS 27 e macOS 27: ...
Apple contro Intel e AMD: i numeri che r...
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: 01:16.


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