Przerywanie wątku

Odpowiedz Nowy wątek
2016-11-30 19:49

Rejestracja: 3 lata temu

Ostatnio: 3 lata temu

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ść?

case 1: {
                    System.out.println("Jaką temperaturę chcesz ustawić? Obecnie jest: "+data.getCurrentTemperature()+"\"C");
                    data.setTemperature(keyboard = read.nextInt());
                    temperature.start();
                    break;
                }

Pozostało 580 znaków

eL
2016-11-30 20:14
eL

Rejestracja: 8 lat temu

Ostatnio: 1 godzina temu

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?

Pozostało 580 znaków

2016-11-30 20:33

Rejestracja: 3 lata temu

Ostatnio: 3 lata temu

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:

Exception in thread "main" java.lang.IllegalThreadStateException
    at java.lang.Thread.start(Thread.java:705)
    at testWatki.Main.main(Main.java:35)
edytowany 1x, ostatnio: saller, 2016-11-30 21:44
Podaj cały stacktrace. Naprawdę wróżbitą nie jestem. - eL 2016-11-30 20:36

Pozostało 580 znaków

2016-11-30 22:01

Rejestracja: 8 lat temu

Ostatnio: 5 godzin temu

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".

Pozostało 580 znaków

2016-11-30 22:15

Rejestracja: 3 lata temu

Ostatnio: 3 lata temu

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()?

Pozostało 580 znaków

2016-11-30 22:39

Rejestracja: 14 lat temu

Ostatnio: 1 minuta temu

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.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2016-12-11 14:06

Rejestracja: 3 lata temu

Ostatnio: 3 lata temu

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.

Pozostało 580 znaków

Odpowiedz

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