Przerywanie wątku

Przerywanie wątku
SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5
0

Cześć,
w instrukcji switch-case wywołuje sobie wątek. Przy ponownej próbie wywołania oczywiście wywala błąd. Jak to można obejść?

Kopiuj
case 1: {
					System.out.println("Jaką temperaturę chcesz ustawić? Obecnie jest: "+data.getCurrentTemperature()+"\"C");
					data.setTemperature(keyboard = read.nextInt());
					temperature.start();
					break;
				}
EL
  • Rejestracja: dni
  • Ostatnio: dni
0
saller napisał(a):

Cześć,
w instrukcji switch-case wywołuje sobie wątek

Co to znaczy?
Bo ja tu widzę tylko pobranie aktualnej temperatury i ustawienie nowej z klawiatury.
Jaki wyjątek leci?

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5
0

"java.lang.IllegalThreadStateException"
Chodzi o to, że wywołuję temperature.start(); za każdym razem gdy wchodzę do case. Dodałem sobie funkcję data.setTemperature(), bo nie wiem jak bezpośrednio do metody run() przekazać wartość.

Edit:

Kopiuj
Exception in thread "main" java.lang.IllegalThreadStateException
	at java.lang.Thread.start(Thread.java:705)
	at testWatki.Main.main(Main.java:35)
KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
1

Na pojedynczym obiekcie Thread metodę start można wywołać tylko jeden raz. Aby uruchomić kilka wątków, dla każdego musisz stworzyć nowy obiekt Thread. Poczytaj w internecie o "thread lifecycle".

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5
0
krupnick napisał(a):

Na pojedynczym obiekcie Thread metodę start można wywołać tylko jeden raz. Aby uruchomić kilka wątków, dla każdego musisz stworzyć nowy obiekt Thread. Poczytaj w internecie o "thread lifecycle".

Czy jest jakaś możliwość, żeby zakończyć tą metodę run() i potem jeszcze raz wywołać start()?

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
1

Tak. Możesz:

  • wstawić jakąś flagę typu np AtomicBoolean do twojej klasy z wątkiem
  • w metodzie run sprawdzać wartość flagi i jeśli się zmieni to wyjść z metody (co jest równoznaczne z zakończeniem wątku)
  • z zewnątrz czekasz na zakończenie wątku za pomocą thread.join()

Jak już ktoś napisał - nie możesz dwa razy wywołać start na jednej instancji Thread, więc musisz stworzyć kolejną i na niej dać start.

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5
0

Dla kogoś na przyszłość mogę doradzić, że lepiej wykorzystać klasę Executor. Możliwe, że coś źle robiłem, ale użycie metody thread.join() nie dawało oczekiwanych rezultatów.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.