PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : fragen zur anwendung von sleep (java)



namous
13-03-2003, 19:54
also ich hab ne blöde frage hab mir mal vorgenommen was in java zu programmieren nicht besonderes. ich möchte in einem Thread ein sleep einbauen (für bsw. 10sec). wie funzt das??



class gehschlafen extends Thread
{
System.out.println("ich geh schlafen");
sleep(10000);
println("bin schon wieder wach!");
}



'unreported exception java.lang.InterruptedException; must be caught or declared to be thrown sleep(10000);'
bringt der mir als fehler (javac/linux). weiß jamand warum?? ich hab momentan keine package importiert.hab den code oben natürlich schon in main drinne also ich hab net versucht den so zu kompilieren!

Danke mal im vorraus!

maceop
13-03-2003, 20:39
probier es mal so:



class gehschlafen extends Thread
{
System.out.println("ich geh schlafen");

try
{
sleep(10000);
}
catch (InterruptedException ie)
{
//geb was aus, mach sonst was....
}

println("bin schon wieder wach!");
}



mfg
maceop

namous
13-03-2003, 20:44
very thanks

also muss man bei solchen sachen immer dieses try usw. machen? warum eigentlich das muss man ja uch machen wenn amn mit dateien arbeitet gibts da nen speziellen grund? also so weit ich das try und verstanden hab ist es dafür da wenn ein fehler passiert kann man ihn erkennt (zu mindest kenn ich die verwendung, gibt sicherlich auch andere breiche wo das verwendet wird!), aber warum wird sowas dann erzwungen??

vielen dank

//marius

anda_skoa
13-03-2003, 21:00
Du musst alle Exceptions fangen, die in der Signatur einer Funktion aufgeführt sind, oder deine Funktion so deklarieren, dass sie ebenfalls diese Exceptions werfen kann.
Dann muss sie der Code fangen, der diese Funktion aufruft.

Eine Exception wird immer dann geworfen, wenn eine Operation nicht wie vorgesehen behandlet werden konnte.

Damit der Programmierer auf diese Möglichkeit nicht vergisst, meldet der Compiler bei Funktionen mit entsprechender Deklaration, dass man noch unbedandelte Exception Typen zu behandeln hat.

Exceptions sind eine feine Sache, um eben nicht am Ort, wo der Fehler auftritt, den Fehler behandeln zu müssen, sondern dort, wo es am passensten ist.

Ciao,
_

namous
13-03-2003, 21:30
ok danek hab ich glaub ich einigermaßen verstanden :)

jetzt ha ich ein anderes problem:



byte[] chatin=new byte[10];
String chat=new String(chatin);

System.in.read(chatin);
chat=chatin.toString();
System.out.println(chat);


wirft nicht das aus was ich eingebe! Fehler beim kompilieren gibts allerdings nicht!

Danke im Voraus

//marius

anda_skoa
13-03-2003, 21:41
Das toString des Arrays gibt die Referenz des Array Objects aus und den Typ, wenn ich mich richtig erinnere.

So sollte es gehen:


byte[] chatin=new byte[10];

System.in.read(chatin);
String chat= new String(chatin);
System.out.println(chat);


Wahrscheinlich wäre es aber ohnehin vernünftiger, einen BufferedReader in Kombination mir einem InputStreamReader am System.in aufzusetzen und dann die readLine() Methode des BufferedReaders zu benutzen.

Ciao,
_

namous
13-03-2003, 22:35
gut! das mit der ausgabe der eingabe klappt nun, danke anda_skoa! nun will ich aber einen thread aus einen anderen anhalten und wieder fortsetzen, mit suspend() und resume(). aber er meldet

non-static method suspend() cannot be referenced from a static context chatoutput.suspend();

versteh das erhlichgesagt nicht!
kann mir jemand helfen??

PS: wie löscht man eigentlich den bildschirm??

//marius

itsme
14-03-2003, 06:44
Statische Methoden können nur in einer statischen Methode aufgerufen werden, und umgekehrt.

peschmae
14-03-2003, 08:59
Statische Methoden können nur in einer statischen Methode aufgerufen werden, und umgekehrt.

Nein, wohl eher: Nicht statische Methoden können nur in einer nicht statischen Methode aufgerufen werden. Statische Methoden können aber sehr wohl von nicht statischen aufgerufen werden (einfach Klassenname.Methodenname())

MfG Peschmä

anda_skoa
14-03-2003, 09:15
Original geschrieben von namous
gut! das mit der ausgabe der eingabe klappt nun, danke anda_skoa! nun will ich aber einen thread aus einen anderen anhalten und wieder fortsetzen, mit suspend() und resume(). aber er meldet


suspend und resume sind laut Doku deprecated

Ciao,
_

peschmae
14-03-2003, 09:26
afaik sollte man das jetzt mit

interrupt();
interrupted();
isInterrupted();

machen (http://java.sun.com/j2se/1.4.1/docs/api/java/lang/Thread.html#interrupt() )
weil das alte Zeugs bei vielen zu deadlocks geführt hat.

Ich hab mich allerdings noch nicht so damit auseinandergesetzt. Auf jeden Fall hats in den Büchern "Thinking in Java" und in "Core Java II (Advanced Features)" ein bisserl Text dazu

MfG Peschmä

anda_skoa
14-03-2003, 09:45
Man muss das selber über wait und notify implementieren.

Ciao,
_

itsme
14-03-2003, 09:55
Nein, wohl eher: Nicht statische Methoden können nur in einer nicht statischen Methode aufgerufen werden. Statische Methoden können aber sehr wohl von nicht statischen aufgerufen werden (einfach Klassenname.Methodenname())

Stimmt, war wohl noch zu früh am Morgen! ;)

namous
14-03-2003, 13:54
hmm? wie mach ich das das ich aus einem thread einen anderen stop? muss ich dann den thread der gestop werden soll als non-pulic definieren?? also soweit ich das verstanden hab ist die stop (oder warscheinlich interrupt auch) non-static sind und der Thread aus dem ich stoppen will und der Thread den ich stoppen will static sind!
so und wie mach ich die Threads jetzt non-static(sorry das ich so blöde fragen stell)? bzw. was muss ich machen das ich das prob nicht mehr bzw. das das stop/interrup geht?

und wie löscht man einen Bildschirm??

danke und danke schon mal im voraus

//marius

peschmae
14-03-2003, 14:12
wie hast du die denn static gemacht? Poste doch male den code


und wie löscht man einen Bildschirm??
irgendwie mit Escape Sequenzen sollte es schon gehen
schau mal da:
http://www.mrunix.de/forums/showthread.php?threadid=30927&highlight=escape
und da:
http://www.isthe.com/chongo/tech/comp/ansi_escapes.html

Einfach mit


System.out.println("\033[2J;0m"); oder so

MfG Peschmä

anda_skoa
14-03-2003, 15:02
Original geschrieben von namous
hmm? wie mach ich das das ich aus einem thread einen anderen stop? muss ich dann den thread der gestop werden soll als non-pulic definieren?? also soweit ich das verstanden hab ist die stop (oder warscheinlich interrupt auch) non-static sind und der Thread aus dem ich stoppen will und der Thread den ich stoppen will static sind!
so und wie mach ich die Threads jetzt non-static(sorry das ich so blöde fragen stell)? bzw. was muss ich machen das ich das prob nicht mehr bzw. das das stop/interrup geht?


Du brauchts wie immer einfach einer Referenz auf den Thread, bzw das Runnable.

Wenn ein Thread in einer Schleife läuft, muss du ein Flag ein bauen, dass er regelmäßig checkt und dir Schleife verlässt, sobald es gesetzt ist.

Der Aufrufer muss dann dieses Flag setzen.

Wenn der Aufrufer auf das Beenden warten will, muss der Zugriff entsprechend synchronisiert sein.

Ciao,
_

namous
14-03-2003, 17:18
Also das ist mein code:



class outputthread extends Thread
{
int i;
public void run()
{
for (i=0; i<10; i++)
{
try //Fehler NR 1
{
sleep(1000);
}
catch (InterruptedException ie)
{
System.out.println("Fehler NR 1");
}
System.out.println("outputthread");
}
}
}

class inputthread extends Thread
{
public void run()
{
try //Fehler NR 2
{
sleep(3050);
}
catch (InterruptedException ie)
{
System.out.println("Fehler NR 2");
}
System.out.println("stop");
/*hier soll outputthread stoppen*/
try //Fehler NR 3
{
sleep(3000);
}
catch (InterruptedException ie)
{
System.out.println("Fehler NR 3");
}
System.out.println("weiter");
/*Hier soll inputthread weitergehen*/
}
}

public class fatchat
{
public static void main(String[] args)
{
outputthread out=new outputthread();
inputthread in=new inputthread();

out.start();
in.start();
}
}


und ich möchte ja wie man vielleicht erkennt aus dem inputthread den outputthread nach 3sec anhalten und dann nach 3sec späther wieder weiterlaufen lassen.

anda_skoa
14-03-2003, 17:52
Hmm, verstehe.
Ich versuchs mal so ungefährt, also nicht getestet



public class ThreadSyncher
{
private boolean m_hold;
private boolean m_held;
private boolean m_running;

ThreadSyncher()
{
m_hold = false;
m_held = false;
m_running = false;
}

public synchronized void hold()
{
m_hold = true; // tell other thread to hold

// wait until the other thread says it stopped
while (m_running && !m_held)
{
try
{
wait();
}
catch (InterrruptedException e)
{
}
}
}

public synchronized void release()
{
m_hold = false; // allow thread to resume

// wait until other thread continues
while (m_running && m_held)
{
notifyAll(); // wake waiting threads if any
try
{
wait();
}
catch (InterrruptedException e)
{
}
}
}

public synchronized void starting()
{
m_running = true;
notifyAll();
}

public synchronized void stopping()
{
m_running = false;
notifyAll();
}

public synchronized void checkHold()
{
while (m_hold)
{
m_held = true
notifyAll();
try
{
wait();
}
catch (InterrruptedException e)
{
}
}
m_held = false;
notifyAll();
}
}


Dieses Synch Object wird nun an beide Threads gereicht.


public class fatchat
{
public static void main(String[] args)
{
ThreadSyncher syncher = new ThreadSyncher();
outputthread out=new outputthread(syncher);
inputthread in=new inputthread(syncher);

out.start();
in.start();
}


Die Threads benutzen ihn so


private ThreadSyncher m_syncher;
public outputthread(ThreadSyncher syncher)
{
m_syncher = syncher;
}

public void run()
{
m_syncher.starting();
for (i=0; i<10; i++)
{
m_syncher.checkHold();
try //Fehler NR 1
{
sleep(1000);
}
catch (InterruptedException ie)
{
System.out.println("Fehler NR 1");
}
System.out.println("outputthread");
}
m_syncher.stopping();
}




// input: Contructor spar ich mir
public void run()
{
try //Fehler NR 2
{
sleep(3050);
}
catch (InterruptedException ie)
{
System.out.println("Fehler NR 2");
}
System.out.println("stop");
/*hier soll outputthread stoppen*/
m_syncher.hold();
try //Fehler NR 3
{
sleep(3000);
}
catch (InterruptedException ie)
{
System.out.println("Fehler NR 3");
}
System.out.println("weiter");
/*Hier soll outputthread weitergehen*/
m_syncher.release();
}


Ciao,
_

namous
15-03-2003, 15:51
puhhh hab jetzt ein paar bugs rausgemacht (die ich allerdings selber reingemacht hab, bei anda_skoa haben nur ein paar ";" gefehlt also keine richtigen fehler *respect*)und der quellcode schaut jetzt so aus:




class outputthread extends Thread
{
int i;

private ThreadSyncher m_syncher;

public outputthread(ThreadSyncher syncher)
{
m_syncher = syncher;
}


public void run()
{
m_syncher.starting();

for (i=0; i<100; i++)
{
m_syncher.checkHold();
try //Fehler NR 1
{
sleep(500);
}
catch (InterruptedException ie)
{
System.out.println("Fehler NR 1");
}
System.out.println("outputthread");

}
m_syncher.stopping();
}
}

class inputthread extends Thread
{

private ThreadSyncher m_syncher;
public inputthread(ThreadSyncher syncher)
{
m_syncher = syncher;
}
public void run()
{
try //Fehler NR 2
{
sleep(10050);
}
catch (InterruptedException ie)
{
System.out.println("Fehler NR 2");
}

System.out.println("stop");
m_syncher.hold();

try //Fehler NR 3
{
sleep(10000);
}
catch (InterruptedException ie)
{
System.out.println("Fehler NR 3");
}
System.out.println("weiter");
m_syncher.release();
}
}

public class fatchat
{
public static void main(String[] args)
{

ThreadSyncher syncher = new ThreadSyncher();
outputthread out=new outputthread(syncher);
inputthread in=new inputthread(syncher);

out.start();
in.start();

}
}

und


public class ThreadSyncher
{
private boolean m_hold;
private boolean m_held;
private boolean m_running;

ThreadSyncher()
{
m_hold = false;
m_held = false;
m_running = false;
}

public synchronized void hold()
{
m_hold = true; // tell other thread to hold

// wait until the other thread says it stopped
while (m_running && !m_held)
{
try
{
wait();
}
catch (InterruptedException e)
{
}
}
}

public synchronized void release()
{
m_hold = false; // allow thread to resume

// wait until other thread continues
while (m_running && m_held)
{
notifyAll(); // wake waiting threads if any
try
{
wait();
}
catch (InterruptedException e)
{
}
}
}

public synchronized void starting()
{
m_running = true;
notifyAll();
}

public synchronized void stopping()
{
m_running = false;
notifyAll();
}

public synchronized void checkHold()
{
while (m_hold)
{
m_held = true;
notifyAll();
try
{
wait();
}
catch (InterruptedException e)
{
}
}
m_held = false;
notifyAll();
}
}

und er funktioniert!!!! also vielen danke jetzt kann ich damit weiterarbeiten!!