DXP GT – Fireplace
DXP GT – Mobile Footer Layer

Java sleep

striker159

Lt. Junior Grade
Registriert
Dez. 2008
Beiträge
333
hallo,
ich möchte mir auf der konsole eine kleine "animation" erstellen. in etwa so:

wiederhole {
es wird etwas ausgegeben
es wird eine halbe sekunde gewartet
bisherige ausgabe wird gelöscht
}

da habe ich mir gedacht, java hat bestimmt auch eine sleep methode, benutzt du einfach diese.

dabei kam folgender code raus
Code:
public void animation(){
Thread.sleep(500);		
System.out.close();
System.out.println(irgendwas)
}

wenn ich das so ausführen will , meckert der compiler
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Unhandled exception type InterruptedException

wie bekomme ich das hin, dass er die halbe sekunde wartet, bis er das neue ausgibt?
 
Thread.sleep() kann eine Exception werfen die du behandeln musst, oder zumindest fangen:

try {
Thread.sleep(500);
}catch(InterruptedException e){
e.printStackTrace();
}
 
Ich würde dir nahelegen dich mit Exceptions Allgemein zu beschäftigen und nicht das oben genannte Beispiel einfach zu kopiern .
 
Das ist natürlich richtig ;) Aber fangen muss man die an der Stelle trotzdem, und sleep sollte quasi nie werfen
 
das problem ist, dass bei mir sleep immer eine exception wirft, und es nie ausgeführt wird.

edit: ah sry, hab vergessen, das printen auch in den try block zu schreiben :(

es klappt allerdings immernoch nicht wie gewollt:

Code:
	public void animation() {

		try {
			
			Thread.sleep(500);
			System.out.close();
			for(int[] i:raum){
				for (int j:i){
					switch(j){
					case 0:{
						System.out.print("_ ");
						break;
					}
					case 1:{
						System.out.print("F ");
						break;
					}
					case 4:{
						System.out.print("Z ");
						break;
					}
					case 5:{
						System.out.print("x ");
						break;
					}
					default:;
					}
				}
				System.out.println();
			}
			}catch(InterruptedException e){
			e.printStackTrace();
			} 

	}
mit diesem code bleibt die console leider leer. wenn ich out.close() auskommentiere, wartet er richtig ne halbe sekunde. aber dann hab ich natürlich zig ausgaben anstatt einer.
 
Zuletzt bearbeitet:
naja ein timer ist meiner meinung nach overkill dafür, zumal es nur eine kleine spielerei sein soll. hatte timer auch noch nie in java benutzt^^

die main methode ruft in einer schleife die animationsmethode auf. von daher sollte das sleep doch an der richtigen stelle sein, oder etwa nciht?

edit :da habe ich mich wohl falsch informiert mit dem close...
gibt es denn dann eine möglichkeit, den bisherigen konsoleninhalt zu löschen?
an sonsten hat dieser threat für mich keinen sinn mehr :)
 
Zuletzt bearbeitet:
@Whiz-zarD: Kann schon sein, die Entscheidung nur anhand des Code-Schnipsels zu treffen dürfte kaum eindeutig möglich sein...

@striker159: Konsole leeren: Afaik nein...
und könntest du mal genau sagen, was für dich "eine Ausgabe" heißt?

Ein "clear" macht auf einem strombasierten Medum auch keinen Sinn... und genau das ist die Konsole nunmal.
 
Zuletzt bearbeitet:
close() schließt den Stream und somit auch standard-out. Deswegen passiert danach auch nichts mehr.
Es gibt kein clear() Kommando für ein Stream. Wie auch?
In Konsolen, die im Grafikmodus laufen, werden einfach so lange Leerzeilen hinzugefügt, bis es so aussieht, als ob der Bildschirm gelöscht wurde. Nur im Textmodus gibt es eine Möglichkeit, indem man den Bildschirmspeicher löscht. Vielleicht hat man noch die Möglichkeit, mit den Steuerzeichen zu arbeiten, aber sowas hab ich bis jetzt noch nie in Java ausprobiert.

Ich weiß auch nicht, was am Timer so overkill sein soll, denn er ist genau dafür da, wiederkehrende Aktionen, mit einem Delay, auszuführen:
Code:
public class Main
{
    public static void main(String[] args)
    {
        Timer timer = new Timer();
        timer.schedule(timertask, 0, 500);
    }

    private static TimerTask timertask = new TimerTask(){

        @Override
        public void run()
        {
            System.out.println("Tuwas");    
        }  
    };
}

Dies hat den Vorteil, dass der Main-Thread nicht eine halbe Sekunde lang schlafen gelegt wird, sondern weiterarbeiten kann, da der TimerTask in einem separaten Thread läuft.
Aber gut, muss jeder selbst wissen.
 
Zuletzt bearbeitet:
Löschen kann man simulieren. Für eine Animation empfiehlt sich die Verwendung eines Timers.

Code:
public class Hello
{
    public static void main(final String... rArgs)
        throws Exception
    {
        Hello hello = new Hello();
        hello.print(" Hello, world!");
        hello.delete(" Hello, world!".length());
        hello.println(" Bye, bye");
    }


    private void delete(final int rNumber)
        throws InterruptedException
    {
        for (int i = 0; i < rNumber; i++)
        {
            System.out.print('\u0008');
            System.out.print(' ');
            System.out.print('\u0008');
            Thread.sleep(100);
        }
    }


    private void print(final String rString)
        throws InterruptedException
    {
        for (int i = 0, size = rString.length(); i < size; i++)
        {
            System.out.print(rString.charAt(i));
            Thread.sleep(100);
        }
    }


    private void println(final String rString)
        throws InterruptedException
    {
        print(rString);
        System.out.println();
    }
}
 
@soares: ... simulieren, so lange man eben in einer Zeile bleibt...
und irgendwie eine Ironie, dass du selbst keinen Timer nimmst dann ^^
 
Für mich liest sich die Aufgabenstellung, als wenn der TE eine Fortschrittsanzeige anzeigen lassen möchte. Dafür reicht meist eine Zeile aus und für diesen Fall ist der Trick mit dem Backspace-Zeichen, die meines Wissens einfachste Methode mit Java zum Ziel zu kommen.

Dass ich für das kleine Beispiel, das nichts anderes macht, als Text auszugeben, keinen Timer verwende, spricht nicht gegen den Rat für den TE einen solchen einzusetzen. Dort sollte die Animation parallel zu irgendetwas anderem laufen und man mithin von der Parallelisierung profitieren.
 
Zurück
Oben