Skocz do zawartości
Macok

Zakończenie wątku - jakiego sposobu użyć?

    Rekomendowane odpowiedzi

    Macok

    Mam w swoim programie wątek, który wykonuje w pętli kilka razy bardzo długą operację.

    Użytkownik powinien mieć możliwość zakończenia tego wątku w dowolnym czasie.

    Normalnie wyglądałoby to tak:

    boolean running=true;
    
    public void run(){
     while(running){
       //jakies operacje
     }
    }
    
    public void stop(){
     running=false;
    }

    Niestety w moim programie operacja wykonywana w pętli trwa do kilku minut, więc takie rozwiązanie jest raczej nie do przyjęcia.

    Wszystkie metody dostarczone przez klasę Thread typu stop albo destroy są oznaczone jako przestarzałe, więc raczej nie wypada ich używać.

    Jak można poradzić sobie z tym problemem?

    Z góry dzięki za pomoc!

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    A po co kombinować jak to zrobiłeś? Jest metoda interrupt, i sprawdzasz stan funkcją isInterrupted (jak najczęściej, oczywiście nie należy przesadzić).

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Macok

    Po pierwsze metoda interrupt jest oznaczona jako deprecated, więc powinny istnieć dla niej jakieś lepiej działające alternatywy.

    Po drugie użycie interrupt działa u mnie dokladnie tak samo, jak sposób z pierwszego posta - wątek jest kończony dopiero przy przejściu pętli, nie natychmiastowo.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Ja nie rozumiem problemu. running niech to bedzie property klasy zawierajacej ten watek. Jeśli ustawisz to na false, petla się skończy, watek też. Zrób sobie button, który będzie tą zmienną przestawiał:

           Button closeButton;
    
           closeButton = (Button)findViewById(R.id.Button01);
           closeButton.setOnClickListener(new OnClickListener() 
    {
    	public void onClick(View arg0)
    	{
    		running=false;
    	}
           });  

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Mam w swoim programie wątek, który wykonuje w pętli kilka razy bardzo długą operację.

    Użytkownik powinien mieć możliwość zakończenia tego wątku w dowolnym czasie.

    Normalnie wyglądałoby to tak:

    boolean running=true;
    
    public void run(){
     while(running){
       //jakies operacje
     }
    }
    
    public void stop(){
     running=false;
    }

    Niestety w moim programie operacja wykonywana w pętli trwa do kilku minut, więc takie rozwiązanie jest raczej nie do przyjęcia.

    Wszystkie metody dostarczone przez klasę Thread typu stop albo destroy są oznaczone jako przestarzałe, więc raczej nie wypada ich używać.

    Jak można poradzić sobie z tym problemem?

    Z góry dzięki za pomoc!

    musisz znaleźć sposób przerwania czynności długotrwałej, zakończenie wątku na siłę nic nie da jeżeli wątek jest blokowany

    na pewno twórca klasy która blokuje wątek pomyślał o przerwaniu czynności przed naturalnym końcem musisz z niej skorzystać

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Po pierwsze metoda interrupt jest oznaczona jako deprecated, więc powinny istnieć dla niej jakieś lepiej działające alternatywy.

    Po drugie użycie interrupt działa u mnie dokladnie tak samo, jak sposób z pierwszego posta - wątek jest kończony dopiero przy przejściu pętli, nie natychmiastowo.

    Deprecated? U mnie nie jest :)

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Deprecated? U mnie nie jest :)

    no to u ciebie nie ma, zaktualizuj sobie javadoc i się pojawi :facepalm1:

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    no to u ciebie nie ma, zaktualizuj sobie javadoc i się pojawi :facepalm1:

    Hm...:

    void java.lang.Thread.interrupt()

    public void interrupt ()

    Since: API Level 1

    Posts an interrupt request to this Thread...

    Cóż, jeśli mam coś nieaktualne to chciałbym o tym wiedzieć, ale jak patrzę to jakoś nie wygląda na to. Przejrzałem także definicję klasy Thread (chyba aktualną) i też jakoś nie widziałem, aby porzucili ten mechanizm (tym bardziej, że widziałem tam żadnego zamiennika). Ale człowiek uczy się całe życie, więc mógłbyś to rozwinąć?

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Macok
    musisz znaleźć sposób przerwania czynności długotrwałej, zakończenie wątku na siłę nic nie da jeżeli wątek jest blokowany

    na pewno twórca klasy która blokuje wątek pomyślał o przerwaniu czynności przed naturalnym końcem musisz z niej skorzystać

    Dzięki za odpowiedź, ale czy tak jest na pewno?

    Kiedy program w systemie nie odpowiada (bo wykonuje jakąś długą czynność) to mamy możliwość zabicia go.

    W takim razie wątek chyba również da się jakoś zabić...

    Czynności długotrwałej przerwać niestety nie mogę, bo pochodzi z oddzielnej biblioteki, w którą nie chciałbym ingerować.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Napisano (edytowane)

    zabijasz proces nie wątek jak zamykasz nieodpowiadający program

    wątek należy do procesu a proces jest możliwy do zakończenia w każdym momencie w systemach z wywłaszczeniem Linux w na którym pracuje Android taki jest

    łopatologicznie wygląda to tak:

    wątek to fragment kodu procesu który może być wykonywany lub nie jeżeli dany fragment kodu zostaje odłożony i oczekuje na inne zdarzenie a to zdarzenie nie nadchodzi i nie ma innego powodu żeby kod wykonywać to ten kod pozostaje nieczynny

    @The Dino no to sobie spójrz na zrzut :facepalm1:

    Edytowane przez zawadaki

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

    Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

    Zarejestruj nowe konto

    Załóż nowe konto. To bardzo proste!

    Zarejestruj się

    Zaloguj się

    Posiadasz już konto? Zaloguj się poniżej.

    Zaloguj się

    • Ostatnio przeglądający   0 użytkowników

      Brak zarejestrowanych użytkowników przeglądających tę stronę.

    x