Just nu i M3-nätverket
Gå till innehåll

Thread.sleep()


Agge

Rekommendera Poster

Hej!

 

Har lite problem med trådar och sleep()-funktionen och skulle behöva hjälp med det. Har kollat på nätet samt testat olika sätt men jag får inte det att fungera som jag vill.

Här är min kod:

 

///////////////////////////////////////////////////////////

Thread closeThread = new Thread()

{

public void run()

{

System.out.println("hej");

 

try

{

sleep(1000);

}

catch (InterruptedException e)

{}

 

System.out.println("hej");

 

try

{

sleep(1000);

}

catch (InterruptedException e)

{}

 

System.out.println("hej");

 

try

{

sleep(4000);

}

catch (InterruptedException e)

{}

 

System.out.println("hej");

 

try

{

sleep(2000);

}

catch (InterruptedException e)

{}

 

System.out.println("hej");

 

try

{

sleep(2000);

}

catch (InterruptedException e)

{}

 

System.out.println("hej");

 

}

};

 

closeThread.start();

//////////////////////////////////////////////////////////////////////

 

Där jag har system.out.println gör jag egentligen nåt annat men det skulle bli för mycket kod att visa.

Det jag gör är att jag skickar viss information till en "maskin" som man kan säga styrs av javapplikationen. Informationen jag ska skicka måste skickas med några sekunders mellanrum, det är därför jag har så många sleep-funktioner. På alla ställen där det står "System.out.println" skickar jag egentligen information.

 

Mina frågor är:

 

1) Denna koden fungerar ibland för mig och ibland verkar den göra alla System.out.println på en gång efter att den har väntat väldigt många sekunder. Varför?

 

2) Jag ska ha en tråd till där jag vill ha en "frame" eller nåt som visar texten "wait". Lyckas inte med det särskilt bra. Framen visas inte alltid samtidigt som detta ovan görs, vilket jag vill att den ska göra.

 

Alltså det jag vill göra i stora drag är:

Visa en frame med texten "Wait" samtidigt som jag skickar data i flera omgångar med några sekunders mellanrum.

 

Tack på förhand

 

 

 

Länk till kommentar
Dela på andra webbplatser

-Patrik Johansson-

Hej.

Skapar du en ny instans av Threadklassen?

Varför?

 

Nät jag brukar pyssla med trådar låter jag en klass ärva eller implementera Thread respektive Runnable.

Om du nu skapar en klass som du kallar MyThreadClass så skulle koden för denna klass kunna se ut så här:

public class MyThreadClass implements Runnable{

 public void run() {
   try {
     System.out.println("hej");
     Thread.sleep(2000);  
     System.out.println("hej");
     Thread.sleep(5000);  
     System.out.println("hej");
   } catch (InterruptedException e) {}
 }

 public static void main(String[] args){
   new Thread(new MyThreadClass()).start();
 }
}

Här implementeras Runnable istället för att ärva Thread vilket skulle hinda klassen att ärva från andra klasser.

En ny tråd skapas i den skapas en ny klass.Sedan utförs detta en gång.

 

/Neox -(Patrik J)

"Gravitation can not be held responsible for people falling in love"
- citat av Albert Einstein

 

Länk till kommentar
Dela på andra webbplatser

Skapar du en ny instans av Threadklassen?

Nej, han skapar en instans av ett derivat av Thread-klassen, där run-metoden är modifierad.

 

Fast det gör ingen skillnad i det här fallet, det är samma sak. Trådar i java kan antingen vara derivat av java.lang.Thread eller implementationer av Runnable. I Agges fall så gör han i praktiken ett arv (om än ett anonymt sådant) av Thread.

 

Min gissning är (och det här är ett svar till Agge och hans fråga nummer 1) att det är en fråga om när VM:en flushar det som skrivs till System.out. Thread.sleep() kommer garanterat att låta tråden sova minst så många sekunder som man ber den om ifall den inte blir avbruten (vilket inte skulle märkas eftersom catch:en är tyst som graven).

 

Med en "System.out.flush();" efter varje println() borde utskrifterna komma när de förväntas komma och inte i en klump.

 

[inlägget ändrat 2003-04-11 20:22:44 av fhe]

Länk till kommentar
Dela på andra webbplatser

Nu är det ju så att jag egentligen inte ska ha System.out.println där jag

har dessa utan jag ska skicka data på de ställena istället. Alltså

System.out.println kommer inte alls att finnas i den kod jag egentligen

skriver. Anledningen till att jag inte har skrivit den egentliga koden är

att det skulle bli mer kod att visa och mycket krångligare att förklara.

 

 

 

Länk till kommentar
Dela på andra webbplatser

Naturligtvis, jag förklarade bara den enda tänkbara anledningen att det skulle kunna bli som du beskriver i exemplet ovan.

När du byter ut dina println mot nåt annat så finns de säkert andra saker som kan strula till det men de är ju rätt svåra att gissa utan att veta vad du gör.

 

Eftersom du inte vet vad som går fel skulle jag rekomendera att du börjar med att skriva ut något om dina sleeps blir avbrutna.

 

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...