Newsgroup: it.comp.java
Titolo: Thread


wrote:
public class Principale {
	public static void main(String args[])
	{
		Concorrente   C1=new Concorrente();
		Concorrente2  C2=new Concorrente2();
 
		C1.start();
		C2.start();
	}
}
class Concorrente extends Thread {
	public void run()
	{
		for (int x=0;x<50;x++)
		{
			System.out.println(" Uno ");
			Thread.yield();
		}
	}
}
class Concorrente2 extends Thread{
	public void run()
	{
		for (int x=0;x<50;x++)
		{
			System.out.println(" Due ");
		Thread.yield();
	}
	}
}
Cosě  i due thread si mischiano abbastanza casualmente

Sono un neofita del Borland JBuilder 5 e ho iniziato a studiare Java da
pochi giorni.
Non riesco a far funzionare il seguente programma, vorrei che sullo schermo
apparisse "Uno" e
"Due" per 50 volte e invece prima viene scritto sullo schermo 50 "Uno" e poi
50 "Due".
Come faccio a far eseguire i due thread in contemporanea?
// file: Principale.java
public class Principale {
  public static void main(String args[])
  {
  Concorrente   C1=new Concorrente();
  Concorrente2  C2=new Concorrente2();
  C1.start();
  C2.start();
  }
}
// file: Concorrente.java
public class Concorrente extends Thread {
  public void run()
  {
    for (int x=0;x<50;x++)
    System.out.println(" Uno ");
  }
}
// file: Concorrente2.java
public class Concorrente2 extends Thread{


 ha scritto nel messaggio
news:9vkt8vcosq9usi31e...@4ax.com...

Ho provato a fare come dici ma il programma continua a comportarsi
sempre nello stesso modo.

 Come faccio a far eseguire i due thread in contemporanea?
[cut]
Quando ho fatto la mia prima prova con i thread mi succedeva qualcosa di
simile.
Il problema non sta nei thread, ma nel fatto che il ciclo e' talmente veloce
che il primo thread finisce prima che il secondo inizi.
Prova a inserire un ritardo nei cicli (Thread.sleep(100);) e vedrai che si
sistema tutto.
Ciao!

In realtà i 2 thread non possono andare 'in contemporanea' a meno che 
tu disponga di un sistema con 2 processori. 
Piuttosto essi si troveranno a competere per l'unica cpu, 
quindi sarebbe più corretto parlare di concorrenza.
A parte questa precisazione (spero di non averti offeso, 
è solo per chiarezza) quello che succede è funzione non solo
dello scheduler java, ma anche del sottostante sistema operativo. Lo 
scheduler implementato dalla JVM è un semplice round-robin 'preemptivo'
che sceglie sempre il thread a maggior priorità, sottraendo la cpu ad
un thread nel caso che un altro a priorità maggiore diventi runnable.
Nel tuo caso i 2 thread creati hanno la stessa priorità che ereditano
dal thread in cui gira il main. Essi sono inoltre quelli che in gergo
sono definiti 'selfish thread', ossia thread che non cedono mai la cpu
volontariamente e che quindi, a meno di non essere 'preemptati' da 
qualche thread a + alta priorità, terminerebbero sempre il loro run.
Qui entra in gioco però il SO, che potrebbe adottare una politica di
time-slicing, proprio per evitare che un thread ad alta priorità
monopolizzi la cpu. Windows (penso tutte le versioni da 95 in su) 
adotta proprio questa politica, tuttavia questo non è in contrasto 
con quanto da te sperimentato: infatti potresti disporre di un sistema
veloce a sufficienza da eseguire l'intero ciclo in meno di una singola 
fetta di tempo; in tal caso i due thread andrebbero effettivamente in 
sequenza. Su solaris questo non è più vero. 
Quello che però non mi spiego è come faccia a non funzionare la
soluzione
proposta da Maurizio: effettuando una yeld() ad ogni iterazione l'output
dovrebbe essere sempre:
Uno
Due
Uno
Due
....
Spero di essere stato abbastanza chiaro, in caso contrario chiedi pure.
Ciao a tutti.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG