Android:使线程每秒运行的标准方法

8

我想每秒运行一次Thread类,但不能使用Runnable。我尝试了以下方法,但出现了StackOverflowException错误。请问有没有标准的方法可以让线程类每秒运行一次。

public class A extends Thread {

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

这个链接会帮助你:如何使用TimerTask运行线程 - Palejandro
3个回答

18
使用Timerschedule()scheduleAtFixedRate()这两者之间的区别),并在第一个参数中使用TimerTask,其中您要重写run()方法。
例如:
Timer timer = new Timer();
timer.schedule(new TimerTask()
{
    @Override
    public void run()
    {
        // TODO do your thing
    }
}, 0, 1000);

你的示例会导致堆栈溢出,因为它是无限递归,你总是从run()中调用run()


3
也许你想考虑另一种替代方案,比如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);

我们能不能让一个线程每秒运行一次?我本可以考虑使用Runnable或ScheduledExecutorService,但我卡在了一个必须使用线程的场景中。请帮忙。 - madhu
@madhu: “我陷入了一个必须使用线程的情境中。” - 为什么?请解释一下为什么您不能使用其他方法来完成您需要做的事情。同时,请解释一下您需要做什么。 - Squonk
如果任务需要很长时间,而且所有5个线程都被占用了怎么办?这样做不会完美地工作。请看我的答案 :) - Eng.Fouad
@sqonk:我正在从mainActivity调用这个线程。这个线程是一个抽象类,被另外三个类继承。我在Void Run()中调用了一个抽象方法,这些方法在这三个类中定义。我的意图是一旦这个线程启动,其他类就会同时执行。 - madhu

1
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);

我们可以在继承Thread的类中使用这个吗?还是我需要创建一个服务类? - madhu
我尝试在Thread类中实现这个方法,但它没有起作用。我试图进行调试,但是在scheduleAtFixedRate(new Runnable()之后,流程没有进入void run。 - madhu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接