jeden wątek blokuje cały program

0

Mam program z wątkiem który czeka na wpisanie tekstu i taki problem że ten wątek blokuje mi resztę programu, choć nie zawsze się tak zdarza i czasem zadziała to poprawnie. Co z tym zrobić żeby działało poprawnie zawsze?
A to kod tego wątku

public class Wylacz implements Runnable {
	InputStreamReader reader = new InputStreamReader(System.in);
	BufferedReader in = new BufferedReader(reader);

	public void run() {
		while(true) {
			try {
				String s = in.readLine();
				if ("x".equals(s)) break;
			} catch (IOException e) {}	
		}
		/*
                      jakiś tam kod który ma się wykonać po przerwaniu pętli
                */
	}
}
0

watek ma to do siebie, ze nie moze blokowac innych.

0

Nie musisz tworzyć nowego wątku aby sprawdzić czy podane polecenie z klawiatury powinno zakończyć aplikację. Operacje odczytu danych z konsoli są blokujące. metoda readLine() czeka aż użytkownik nie wprowadzi znaku nowej linii. Jeśli w ogóle wpadłeś na taki pomysł, to znaczy że coś jest nie tak z Twoją aplikacją. Odczytywanie danych z konsoli powinno być na najwyższym poziomie. Jedna klasa powinna współpracować z użytkownikiem i sterować całym programem. Jeśli jednak chcesz iść w tym "nierozsądnym" kierunku, to proponuje przeczytać poniższy link:
[1] http://stackoverflow.com/questions/804951/is-it-possible-to-read-from-a-java-inputstream-with-a-timeout

0

Ten mój program to serwer dla dwóch klientów, który wielokrotnie akceptuje połączenia. W głównej klasie serwera oczekuję w pętli na połączenia, i gdy jest połączenie to wtedy tworzę wątek obsługujący połączenie z klientem. Ten wątek o którym tu pisze i z którym mam problem ma odpowiadać za wyłączenie serwer. Jak pisałem na początku czasami działa to dobrze i readLine() nie blokuje reszty programu.
A co by było jakbym przerobił program tak że w głównej klasie w metodzie main chodziła by sobie ta pętla z tego wątku, a pętla w której akceptuję nowe połączenia była by w osobnym wątku, zaradziło by to coś???

0
wątek mi blokuje napisał(a)

A co by było jakbym przerobił program tak że w głównej klasie w metodzie main chodziła by sobie ta pętla z tego wątku, a pętla w której akceptuję nowe połączenia była by w osobnym wątku, zaradziło by to coś???

eee... zrobiłem tak to teraz wciśnięcie "X" nic nie daje, teraz jakby wątek z tą pętlą w której akceptuję połączenia blokował mi resztę...

mykhaylo napisał(a)

Jeśli jednak chcesz iść w tym "nierozsądnym" kierunku, to proponuje przeczytać poniższy link:

Nie muszę iść koniecznie w tym kierunku jeśli jest nierozsądny, tylko jak to inaczej zrobić? Nie jestem za bardzo obeznany w Javie, dopiero się uczę i nie mam innych pomysłów.

0
mykhaylo napisał(a)

Operacje odczytu danych z konsoli są blokujące. metoda readLine() czeka aż użytkownik nie wprowadzi znaku nowej linii.

No wiem o tym. Ale jak to jest że choć przeważnie readLine() w tym wątku mi blokuje program, to zdarza się czasem że jednak nie blokuje i program działa poprawnie???

0
  1. Pokaż, w jaki sposób tworzysz ten wątek.
  2. W bloku catch daj break. Inaczej w przypadku błędu będziesz mieć nieskończoną pętlę.
  3. Czy któryś inny wątek używa System.in ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1