2013-06-01 36 views
6

Tôi đang cố gắng chạy một lớp học Thread mỗi giây. Tôi không thể sử dụng Runnable. Tôi đã cố gắng theo cách sau, nhưng ném nó StackOverflowException. Bất cứ ai có thể xin vui lòng cho tôi biết một phương pháp tiêu chuẩn để làm cho một lớp thread chạy mỗi giây.Android: Cách chuẩn để tạo chuỗi chạy mỗi giây

public class A extends Thread { 

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

liên kết này sẽ giúp [cách-làm-bạn-use-một-TimerTask-to-run-một-thread] [1] [1]: http://stackoverflow.com/questions/10029831/how-do-you-use-a-timertask-to-run-a-thread – Palejandro

Trả lời

3

Có lẽ bạn muốn xem xét một sự thay thế như 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

Có thể chúng ta tạo một chuỗi chạy mỗi giây? Tôi có thể đã xem xét Runnable hoặc ScheduledExecutorService, nhưng tôi bị mắc kẹt trong một kịch bản mà tôi phải sử dụng một chủ đề. Hãy giúp tôi. – madhu

+0

@madhu: ** "Tôi bị mắc kẹt trong một tình huống mà tôi phải sử dụng một chủ đề." ** - Tại sao? Giải thích lý do tại sao bạn không thể sử dụng những cách khác để làm những gì bạn cần làm. Ngoài ra, hãy giải thích bạn cần làm gì. – Squonk

+0

Điều gì sẽ xảy ra nếu tác vụ mất nhiều thời gian và tất cả 5 chủ đề đều được tiêu thụ? Điều này sẽ không hoạt động hoàn hảo. Xem câu trả lời của tôi :) –

15

Sử dụng Timer 's schedule() hoặc scheduleAtFixedRate() (difference between these two) với TimerTask trong đối số đầu tiên, trong đó bạn được trọng dụng phương pháp run().

Ví dụ:

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

dụ của bạn gây ra stack overflow, bởi vì nó là đệ quy vô hạn, bạn luôn được gọi run() từ run().

+0

Bạn có thể cho tôi một ví dụ không ?? Tôi mới làm điều này ... – 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

Chúng ta có thể sử dụng điều này bên trong một Class mở rộng Thread? Hoặc tôi nên tạo một lớp dịch vụ? – madhu

+0

Tôi đã cố gắng thực hiện phương thức này bên trong một lớp Thread. Tôi không làm việc. Tôi đã cố gắng để gỡ lỗi và dòng chảy đã không nhận được nhập vào void chạy sau khi scheduleAtFixedRate (Runnable mới(). – madhu

Các vấn đề liên quan