我在Java中有一个线程可以进行Web调用并存储检索到的信息,但它只检索该特定时刻的信息。我想在一段时间内每隔一段时间运行一次该线程,以便更好地查看数据。我怎样才能做到这一点?我已经查看了ScheduledExecutorService,从我可以判断线程是否仍在运行的时候设置下一次运行时,它会一直等到第一个线程完成,这不是我正在寻找的。 / p>
答案 0 :(得分:1)
您需要的是scheduleAtFixedRate方法:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable,%20long,%20long,%20java.util.concurrent.TimeUnit)
当调度程序等到第一个线程完成时,它是因为您正在使用scheduleWithFixedDelay。
但是,如果你绝对希望线程同时运行,你应该试试这个:
pool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
pool.submit(myJob);
}
}, 1, 1, TimeUnit.SECONDS);
我建议总是使用游泳池。
答案 1 :(得分:1)
您可以通过双重计划完成此操作。使用scheduleWithFixedDelay()每秒启动一个作业。此作业启动您真正想要运行的方法。以下是一些基于Oracle的ScheduledExecutorService API的代码。
Thread.sleep()用于模拟长时间运行的任务。
class Beeper {
public static void main(String[] args) {
(new Beeper()).beep();
}
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public void beep() {
final Runnable beeper = new Runnable() {
public void run() {
System.out.println("beep");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
final Runnable beeper2 = new Runnable() {
public void run() {
(new Thread(beeper)).start();
}
};
final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(beeper2, 1, 1, SECONDS);
}
}
答案 2 :(得分:0)
这个怎么样?
public static void main (String [] args) throws InterruptedException{
ExecutorService executorService =
Executors.newFixedThreadPool(10);
while (true){
executorService.submit(new Runnable() {
@Override
public void run() {
// do your work here..
System.out.println("Executed!");
}});
Thread.sleep(1000);
}
}