java - JAVA中特定时间以特定时间间隔运行的线程

标签 java android multithreading thread-sleep

我想在JAVA中使用下面提到的操作进行android开发。

  1. 对于 30 秒,每 1 秒运行一次函数 F1()(导致 30 次 F1 调用)。
  2. 永远运行线程 t1

以上步骤应按顺序执行。 我已尝试使用 ExecutorService 但没有成功。

这是我的引用代码

final Handler h = new Handler();
final int delay = 1000; //milliseconds
ExecutorService executor = Executors.newFixedThreadPool(1);

Thread t1 = new Thread(new Runnable() {
    @Override
    public void run() {
        F1();
    }
});

for(int i=0;i<30;i++){
    executor.submit(t1);
    try {
        TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

executor.shutdown();
//Step 2 (THe Second Thread)

h.postDelayed(new Runnable() {
    public void run() {
        AnotherFunction()
        h.postDelayed(this, delay);
    }
}, delay);

最佳答案

通常,ExecutorService 更适合此类操作。这里有个好post描述TimerExecutorService的区别和特点。

至于你的问题直接——可以这样实现:

// here are Runnables with test logic
Runnable foo = new Runnable() {
    @Override
    public void run() {
        Log.d(">>>", "foo");
        onTaskFinished();
    }
};

Runnable longRunning = new Runnable() {
    @Override
    public void run() {
        try {
            Log.d(">>>", "longRunning started");
            Thread.sleep(5000);
            Log.d(">>>", "longRunning finished");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

// and here is valuable logic
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
ScheduledFuture<?> schedulerHandler;
volatile AtomicInteger tasksNum = new AtomicInteger(0);

private synchronized void onTaskFinished(){
    if(tasksNum.incrementAndGet() >= 30){
        scheduler.execute(new Runnable() {
            @Override
            public void run() {
                schedulerHandler.cancel(true);
            }
        });
        scheduler.execute(longRunning);
    }
}

然后调用这个命令开始操作:

schedulerHandler = scheduler.scheduleAtFixedRate(foo, 0, 1, TimeUnit.SECONDS);

关于java - JAVA中特定时间以特定时间间隔运行的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33566172/

相关文章:

java - 服务中的多线程 (Android/Java)

java - 什么时候消息传递(例如 JMS)是多线程的替代方案?

java - 使用分数进行 Junit 测试

android - 如何使 View 变灰。特别是一个 EditText?

Android:将图像附加到电子邮件 Intent - 错误

android - 在 Android 中使用 BLE(iBeacons) 标签进行三角测量

Python如何同步线程?

java - hibernate - 从查询结果返回插入脚本

java - 将我的 Java 应用程序与 knime 链接

JavaFX:如何获得更多 "dummy/empty Rows"