Timeout setzen

noch_anfänger

Aktives Mitglied
Hallo,

ich muss Timeout setzen, weiß aber nicht wie... Das Gerät muss versuchen, id zu lesen, wenn es das in 30 Sekunden nicht schafft, muss die Meldung "ID nicht gelesen" ausgegeben werden.

Der Code-Abschnitt, für welchen Timeout gesetzt werden soll:
Java:
idOne = soapClient.readVariableString("12345");
if (idOne.length() != 14) { // Nicht 'No transponder'
... // Hier wird idOne bearbeitet
...
}
else {
       System.out.println("ID nicht gelesen...");
      }
 

mabuhay

Bekanntes Mitglied
Hmmn evtl. eine Schlaufe welche 30 mal ausgeführt wird und jeweils 1s mit sleep(1000) wartet? Du solltest es dann aber in einen eigenen Thread auslagern dass nicht die ganze Applikation geblockt wird (wenn du das nicht schon hast).

mfg
 

noch_anfänger

Aktives Mitglied
Innerhalb der if-Schleife gibt es schon drei
Java:
 try {
                Thread.sleep(3000);
		} catch (InterruptedException e) {
		}
Und ansonsten noch welche. Ich sollte evtl. andere Threads auch auslagern...

Wie kann man einen Thread auslagern?
 

kay73

Bekanntes Mitglied
Wie kann man einen Thread auslagern?
Es gibt ab Java 1.5 das
Code:
util.concurrent
Paket, mit dem
Code:
Future
-Typen, der genau so ein Warte-Feature hat.

Die Sache hat aber einen Riesenhaken: Wenn eine I/O-Operation auf einem alten
Code:
InputStream
wie
Code:
System.in
oder einem
Code:
Socket.read()
blockiert, reicht es nicht, per
Code:
Future.cancel()
den Thread zu
Code:
interrupt()
-en, sondern der InputStream bzw. Socket muss geschlossen werden, damit der Thread mit einer Exception aussteigt.

Es ist dringend zu empfehlen, dass Du Deine Netzwerkfuntionen wie unten auf NIO-
Code:
InterruptibleChannel
s umstellst, denn deren Blockieren wird korrekt von unterbrochen.

Java:
package timeout;

import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class timeoutDemo {

	public static void main(String[] args) {
		try {
			final ExecutorService exs = Executors.newCachedThreadPool();

			final Future<Object> f = exs.submit(new Callable<Object>() {

				@Override
				public Object call() throws Exception {
					final SocketChannel ch = SocketChannel.open(new InetSocketAddress(Inet4Address.getByName("www.google.de"), 80));
					
					// hier passiert gar nichts 
					ch.read(ByteBuffer.allocate(1));
					return null;
				}
			});

			// Keine neuen Jobs mehr entgegennehmen
			exs.shutdown();

			try {
				// Warten, warten, warten
				System.out.println(f.get(30, TimeUnit.SECONDS));
			} catch (final TimeoutException e) {
				
				// Thread abschiessen
				f.cancel(true);
				throw e;
			}
		} catch (final Throwable e) {
			e.printStackTrace();
		}
	}
}
 
Zuletzt bearbeitet:

noch_anfänger

Aktives Mitglied
Danke für die Antworten!

Ich habe keine Sockets. Ich muss nur die Meldung ausgeben, wenn nach 30 sekunden kein id gelesen wird. Mit dem InterruptibleChannel bin ich überfordert... Ist das nur die einzige Variante, um Threads auszulagern????:L
 

mabuhay

Bekanntes Mitglied
Die Lösung von kay73 scheint was mit Netzwerk zu tun haben, bei dir ist es aber irgend ein an den PC angeschlossenes Gerät nehme ich mal an.

Also du kannst eigene Threads erstellen, welche dann unabhängig vom Haupt-Thread (wo du deine Gui-Aktionen verarbeitest etc., oder einfach alles das nicht blockiert) laufen. Der Haupt-Thread ist derjenige der sozusagen mit der main-Methode gestartet wird.

Ein Thread sieht grob so aus, wobei es eigentlich ein ganz normales Objekt ist wo du die run()-Methode überschreibst und mit deinem Code füllst:
Java:
public class SomeThreadObject extends Thread {

	private boolean done = false;  //evtl. volatile?
	private boolean doneOK = false;

	public SomeThreadObject() {

	}

	@Override
	public void run() {

		done = false;
		doneOK = false;

		while (!done) {
			//Hier läuft dann dein Versuch die ID zu lesen etc.
                       sleep(3000);
		}

		doneOK = true;

	}

	public void done() {

		if (!this.isAlive()) {
			return;
		}

		//Wait until the "run"-loop ended
		while (!doneOK) {
			done = true;
			interrupt();

			try {
				sleep(200);
			} catch (InterruptedException e) {}
		}
	}


}

Informiere dich doch ein wenig über Threads in Java, ist eine praktische Sache und wirst du in solchen Situationen immer wieder brauchen können.

Hinweis:
1. Anstatt Thread kannst du auch Runnable verwenden. Weiss jetzt nicht mehr genau was die Vorteile sind oder ob es überhaupt Vorteile gibt.
2. Wenn sich der Thread nicht sowieso selbst beendet (wenn die run-Methode fertig ist) brauchst du die done() Methode nicht. Willst du den Thread aber "von aussen" beenden, musst du selbst einen Mechanismus einbauen, zum Beispiel wie ich es im Codebeispiel habe.

mfg
 

kay73

Bekanntes Mitglied
Die Lösung von kay73 scheint was mit Netzwerk zu tun haben, bei dir ist es aber irgend ein an den PC angeschlossenes Gerät nehme ich mal an.
Da stand was von SOAP-Client. Aber egal, meine Aussage bezieht sich generell auf das Blockieren von Leseoperation. Du bist dabei, den Thread-Ersteller in genau die Fallen hinein zu manoevrieren, von denen ich spreche.

Ausserdem:
  • Du versuchst, das Rad neu zu erfinden. Das concurrent-Paket waere auch was fuer Dich.
  • 1. Anstatt Thread kannst du auch Runnable verwenden. Weiss jetzt nicht mehr genau was die Vorteile sind oder ob es überhaupt Vorteile gibt.
    Es macht im Allgemeinen keinerlei Sinn, eine Klasse von
    Code:
    Thread
    abzuleiten.
  • Keines der Probleme des Probleme des Thread-Erstellers wird angesprochen.
  • Ersetz' mal Dein
    Code:
     sleep(3000);
    gegen
    Code:
    System.in.read()
    und versuch mal den Thread per
    Code:
    interrupt()
    zu beenden.
 
Zuletzt bearbeitet:

noch_anfänger

Aktives Mitglied
Hier noch mal kurz der Code-Abschnitt, um deutlicher zu machen, was ich habe:

Java:
public class Task extends TimerTask {
...
...
public void run() {
idOne = soapClient.readVariableString("12345"); // Hier wird id gelesen. In der Variable idOne 
//bekommt man entweder id oder "No Transponder". Wenn nach 30 Sekunden nur "No Transponder"
//kommt, muss die Meldung ausgegeben werden (ein output einschalten).
// Dafür will Timeout!
if (idOne.length() != 14) { // Nicht 'No transponder'
 // Weiter wird idOne bearbeitet
try {
			ResultSet rs = null;
			rs = Database.getInstance().getDatabaseResponse(
				"\"" + idOne.substring(6, 30) + "\"");

			if (rs.next()) {
			    writeFunktion(rs);
			    
			    /**
			     * output1 auf grün setzen
			     */
			    soapClient.writeVariableBoolean("34808", true); 
			    soapClient.executeScript("12970"); 
                           /**
			     * output1 (grün) ausschalten nach 3 Sekunden
			     */
			    try {
				Thread.sleep(3000);
			    } catch (InterruptedException e) {
			    }
			    soapClient.writeVariableBoolean("34808", false); 
			    soapClient.executeScript("12970");
                            ...
                            ...
                            ...
                            ...  // Hier kommt noch etwas
} catch (SQLException e) {
			e.printStackTrace();
		    } 
} else {
       System.out.println("ID nicht gelesen...");
      }
      ...
      ...
      ... // Hier kommt noch etwas
}
}

In Main wird die Klasse aufgerufen:
Java:
 public Main() {
        Database.getInstance().connectDatabase(...);
        ...
        ...
        final Timer timer = new Timer();
	timer.schedule(new Task(), 2000, 20000);
        JFrame displayFrame = new JFrame("...");
        ...
        ...
        displayFrame.addWindowListener(new WindowAdapter() {

	    public void windowClosing(WindowEvent e) {
		System.out.println("Closing database connection ...");
		timer.cancel();
		Database.getInstance().closeConnection();
		System.exit(0);
	    }
	});
}

Kann ich in der Klasse Task ein Timeout setzen oder Threads auslagern?
 
Zuletzt bearbeitet:

mabuhay

Bekanntes Mitglied
Da stand was von SOAP-Client. Aber egal, meine Aussage bezieht sich generell auf das Blockieren von Leseoperation. Du bist dabei, den Thread-Ersteller in genau die Fallen hinein zu manoevrieren, von denen ich spreche.

Ausserdem:
  • Du versuchst, das Rad neu zu erfinden. Das concurrent-Paket waere auch was fuer Dich.
  • Es macht im Allgemeinen keinerlei Sinn, eine Klasse von
    Code:
    Thread
    abzuleiten.
  • Keines der Probleme des Probleme des Thread-Erstellers wird angesprochen.
  • Ersetz' mal Dein
    Code:
     sleep(3000);
    gegen
    Code:
    System.in.read()
    und versuch mal den Thread per
    Code:
    interrupt()
    zu beenden.
Ja stimmt, bin ein wenig Abgewichen, eigentlich gings ja nur um die Möglichkeit des Timeouts... Werde mir das concurrent-Paket auf jeden Fall auch mal Anschauen. Das unterbrechen während read() ist mit meiner Methode natürlich nicht möglich. Ich habs halt auch schon mit Pollen versucht, also dass zum Beispiel jede Sekunde versucht wird zu lesen oder eine Verbindung aufzubauen. Ist aber natürlich nicht so schön...

Wieso genau macht es keinen "Sinn", eine Klasse von Thread abzuleiten? Wenn ich einen Thread habe der zum Beispiel etwas berechnet, sollte ich dann auch das concurrent-Paket verwenden oder ist dann Runnable/Thread angebracht? Bin bis jetzt bei der Suche nach Thread-Lösungen leider noch nie über das concurrent-Paket gestossen. Btw, in diesem Tutorial Defining and Starting a Thread (The Java™ Tutorials > Essential Classes > Concurrency) wird aber auch Runnable/Thread Beschrieben. Sowie ich das aber verstehe ist Runnable/Thread ok für Simple Anwendungen, für Komplexere Anwendungen und zur Ausnützung aller Features sollte aber java.util.concurrent verwendet werden (High Level Concurrency Objects (The Java™ Tutorials > Essential Classes > Concurrency)) ...sorry für die Abschweifung und Danke für den Hinweis ;)

mfg
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
0 Timeout für Thread setzen? Allgemeine Java-Themen 2
M Webservice timeout bei Ausführung der .jar Allgemeine Java-Themen 3
M iMacros/Timeout Allgemeine Java-Themen 0
G Timeout funktion zu einer Eventlogabfrage Allgemeine Java-Themen 2
R Socket verbindung mit Timeout Allgemeine Java-Themen 2
S Thread nach Timeout beenden Allgemeine Java-Themen 2
K Runtime.exec mit Timeout Allgemeine Java-Themen 5
J url-Service timeout einrichten? Allgemeine Java-Themen 10
P Nicht terminierende Methoden abfangen - timeout ? Allgemeine Java-Themen 3
M Servlet --> Berechnung --> Timeout vom Proxy oder IE!? Allgemeine Java-Themen 7
berserkerdq2 Was heißt es mit FXML Listener zu setzen ind Buttons zu erstellen? Allgemeine Java-Themen 6
TheSepp Java bestimmtes Array auf den Wert 0 setzen Allgemeine Java-Themen 32
Y Bild in JPanel setzen Allgemeine Java-Themen 2
C javax.mail.Message message.setreplyto() null setzen (keine replyto Adresse) Allgemeine Java-Themen 25
JavaNewbie2.0 Anführungszeichen setzen Allgemeine Java-Themen 3
OnDemand FTP4J Rechte setzen Allgemeine Java-Themen 1
J Mausposition setzen Allgemeine Java-Themen 2
I Setzen und Lesen eines Objektes (Enum?) Allgemeine Java-Themen 10
N event_scheduler richtig setzen? Allgemeine Java-Themen 1
O log4j pfad per umgebungsvariable setzen Allgemeine Java-Themen 5
F JTextArea Cursor in die nächste Zeile setzen Allgemeine Java-Themen 2
G JDK setzen Allgemeine Java-Themen 4
H java.util.logging Formatter Optionen setzen Allgemeine Java-Themen 2
iB0T "goto" Befehl aus Batch in Java und Variablen wert immer wieder neu setzen Allgemeine Java-Themen 4
D ClassLoader für Variablen einer Klasse setzen Allgemeine Java-Themen 24
C Datentypen int in bytes zerlegen und wieder zusammen setzen Allgemeine Java-Themen 13
M Session-Parameter setzen? Allgemeine Java-Themen 10
D Alle Variablen final setzen ? Allgemeine Java-Themen 26
I %AppData% Variable für einen Prozess setzen Allgemeine Java-Themen 23
N java.util.Date - Zeit auf 00:00 setzen Allgemeine Java-Themen 3
T HTTP Skript für Passwortgeschützte Seite :: Häkchen setzen und Download Allgemeine Java-Themen 4
L Variablen Systemvariablen setzen Allgemeine Java-Themen 3
G JNDI Context setzen Allgemeine Java-Themen 3
S "Working Directory" setzen..? Allgemeine Java-Themen 3
A Datei als Object einlesen und das Object als Singleton instance setzen. Allgemeine Java-Themen 13
V Priorität der Event-Handlings setzen Allgemeine Java-Themen 4
P Einzelne Bits in einem Byte-Array setzen Allgemeine Java-Themen 2
X JTable mit Checkboxen -> Setzen (true/false) der Checkboxen per Mouseklick... Allgemeine Java-Themen 3
S String intelligent zusammen setzen Allgemeine Java-Themen 8
A Umgebungsvariable unter Windows Vista setzen Allgemeine Java-Themen 60
N ranges setzen Allgemeine Java-Themen 5
O getRuntime().Exec() - Environment - Variablen setzen? Allgemeine Java-Themen 2
Y beliebige Dateigröße setzen Allgemeine Java-Themen 10
G Proxy- Server setzen Allgemeine Java-Themen 2
thE_29 Rechnungen (Sättigung setzen) verschnellern Allgemeine Java-Themen 13
M nichtreferenzierte Objekte auf NULL setzen -> Performance Allgemeine Java-Themen 4
M Focus setzen - Frage zu FAQ Artikel Allgemeine Java-Themen 6
reibi Priorität setzen bei Thread Allgemeine Java-Themen 11
0 Taste setzen Allgemeine Java-Themen 2
B Listener dynamisch setzen Allgemeine Java-Themen 6
F Werte von Member-Variablen erst im Konstruktor setzen? Allgemeine Java-Themen 7
P Datum in einer DateComboBox setzen Allgemeine Java-Themen 7
MQue Datum in ComboBox setzen Allgemeine Java-Themen 9
MQue Objektvariablen setzen Allgemeine Java-Themen 3
MQue Button Attribute setzen Allgemeine Java-Themen 14
L datum nach dem kopiervorgang neu setzen? Allgemeine Java-Themen 2
P JNI_CreateVM und -Xms –Xmx setzen Allgemeine Java-Themen 10
R Array komplett auf null setzen Allgemeine Java-Themen 10
B Choice setzen Allgemeine Java-Themen 5
O Environment Variable Setzen Allgemeine Java-Themen 2
O Schreibrechte setzen? Allgemeine Java-Themen 4
TheJavaKid Focus für KeyListener setzen Allgemeine Java-Themen 5
D Position des Mauszeigers setzen! Allgemeine Java-Themen 3
S Odnericon neu setzen/auslesen etc. Allgemeine Java-Themen 2
G Konsoleneingabe: vordefinierte werte setzen? geht das? Allgemeine Java-Themen 4
foobar java.library.path Property setzen Allgemeine Java-Themen 5
Z Parallel Port, setzen der einzelnen Pins Allgemeine Java-Themen 4
C Setzen der Cursorposition Allgemeine Java-Themen 2
G Standard-Drucker mit Java setzen Allgemeine Java-Themen 4
T Classpath per Java Programm setzen Allgemeine Java-Themen 9
D jdic classpath setzen Allgemeine Java-Themen 2
S Grafiken/ImageIcon setzen Allgemeine Java-Themen 24
S File Encoding im Programm setzen? Allgemeine Java-Themen 3
clemson Umgebungsvariable setzen und lesen Allgemeine Java-Themen 9
F Verfügbaren Heap-Speicher setzen Allgemeine Java-Themen 2
M Content-Type setzen und auslesen? Allgemeine Java-Themen 2
C Objekte null setzen? Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben