2013-06-01 11 views
6

Próbuję uruchomić co sekundę klasę Thread. Nie mogę używać Runnable. Próbowałem w następujący sposób, ale jego rzucanie StackOverflowException. Czy ktoś może proszę dać mi standardową metodę, aby klasa wątku działała w każdej sekundzie.Android: Standardowy sposób wykonywania wątków uruchamianych co sekundę

public class A extends Thread { 

    public void run() { 
     //do my stuff 
     sleep(1*1000,0); 
     run(); 
    } 
} 
+0

ten link pomoże [How-do-you-use-a-TimerTask-to-run-a-wątku] [1] [1]: http://stackoverflow.com/questions/10029831/how-do-you-use-a-timertask-to-run-a-thread – Palejandro

Odpowiedz

3

Może warto rozważyć alternatywy jak ScheduledExecutorService

ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(5); 

/*This schedules a runnable task every second*/ 
scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() { 
    public void run() { 
    DoWhateverYouWant(); 
    } 
}, 0, 1, TimeUnit.SECONDS); 
+0

Nie możemy zrobić wątku uruchamianego co sekundę ?? Mógłbym rozważyć Runnable lub ScheduledExecutorService, ale utknąłem w scenariuszu, w którym muszę użyć wątku. Proszę pomóż. – madhu

+0

@madhu: ** "utknąłem w scenariuszu, w którym muszę użyć wątku." ** - Dlaczego? Wyjaśnij, dlaczego nie możesz użyć innych sposobów, by zrobić to, co musisz. Wyjaśnij też, co musisz zrobić. – Squonk

+0

Co zrobić, jeśli zadanie trwa długo i wszystkie 5 wątków zostało zużyte? To nie zadziała idealnie. Zobacz moją odpowiedź :) –

15

Zastosowanie Timer „s schedule() lub scheduleAtFixedRate() (difference between these two) z TimerTask w pierwszym argumencie, w którym jest przesłanianie metody run().

Przykład:

Timer timer = new Timer(); 
timer.schedule(new TimerTask() 
{ 
    @Override 
    public void run() 
    { 
     // TODO do your thing 
    } 
}, 0, 1000); 

Twój przykład powoduje przepełnienie stosu, bo to nieskończonej rekurencji, zawsze dzwoni run() z run().

+0

Czy możesz podać mi przykład? Jestem nowy w tym ... – madhu

2
final ExecutorService es = Executors.newCachedThreadPool(); 
ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor(); 
ses.scheduleAtFixedRate(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     es.submit(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       // do your work here 
      } 
     }); 
    } 
}, 0, 1, TimeUnit.SECONDS); 
+0

Czy możemy użyć tego wewnątrz klasy, która rozszerza wątek ?? A może powinienem stworzyć klasę usług? – madhu

+0

Próbowałem zaimplementować tę metodę wewnątrz klasy wątku. Nie działałem. Próbowałem debugować i przepływ nie został wprowadzony do nieważnego uruchomienia po scheduleAtFixedRate (new Runnable()). – madhu

Powiązane problemy