我想在JAVA中使用下面提到的操作进行android开发。
- 对于 30 秒,每 1 秒运行一次函数 F1()(导致 30 次 F1 调用)。
- 永远运行线程 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描述Timer
和ExecutorService
的区别和特点。
至于你的问题直接——可以这样实现:
// 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/