Java:如何每秒创建一个新线程

时间:2015-03-03 16:33:16

标签: java multithreading

我在Java中有一个线程可以进行Web调用并存储检索到的信息,但它只检索该特定时刻的信息。我想在一段时间内每隔一段时间运行一次该线程,以便更好地查看数据。我怎样才能做到这一点?我已经查看了ScheduledExecutorService,从我可以判断线程是否仍在运行的时候设置下一次运行时,它会一直等到第一个线程完成,这不是我正在寻找的。 / p>

3 个答案:

答案 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);
    }       
}