与不同的睡眠时间同时运行两个线程

问题描述:

我有一种情况,每分钟运行一次thread1,每小时运行一次thread2。我怎样才能做到这一点。与不同的睡眠时间同时运行两个线程

目前我有一个工作代码,每分钟后运行thread1。

主要方法

static void main(string args[]){ 
     orderListner thread1 = new orderListner(); 
     thread1.start(); 
    } 

线程1

public static void orderListner extends thread{ 
     public void run(){ 
     while(true){ 
      process(); 
      thread.sleep(60000); 
     } 
     } 
    } 

现在我要开始为结果新的线程它每隔一小时后运行。我怎样才能同时实现(thread1将连续运行thread2应该每小时启动一次)

+2

为什么不使用两个定时器来代替? –

+0

使用时间任务。看看这里http://download.oracle.com/javase/1.4.2/docs/api/java/util/TimerTask.html –

+0

如果你可以每分钟做一次,你可以每隔一小时做一次。只要将睡眠时间乘以60.我错过了什么?请解释你想更明确地做些什么。 –

更好的方式来使用线程类是使对象,实现Runnable而不是扩展线程。如果你不想创建另一个文件,只需创建一个匿名类。 (尽可能避免使用继承是一种好习惯。)

这就是说,只需创建一个运行在小时的新线程并启动它即可。我将使用你的线程方法。

static void main(string args[]){ 
      orderListner thread1 = new orderListner(); 
      orderListner2 thread2 = new orderListner2(); 
      thread1.start; 
      thread2.start; 
     } 

线程1是相同的,线程2是

public static void orderListner2 extends thread{ 
     void run(){ 
     while(true){ 
      process(); 
      thread.sleep(3600000); 
     } 
     } 
    } 
+0

如果我错了,请纠正我。在main方法中我们定义了thread1.start;这意味着游标不会返回到此类,直到thread1终止,以启动thread2。 – gmeka

+0

如果您注意到线程类中定义的方法名称以及调用启动线程类的方法,它们是不一样的。线程代码在名为'run'的方法中定义,而线程实际上是通过调用名为'start'的方法启动的。在'start'内部会调用各种黑魔法,这意味着'run'方法中的代码是从另一个代码运行__separately__,并且'start'方法几乎立即返回到main。之后,第二个线程以相同的向导方式启动;) – davogotland

+0

睡眠线程并不是一个计划执行的好方法。更好的方法是使用定时器或调度程序 - 查看@ mre的答案。 –

我建议你使用ScheduledExecutorService来集中这些任务。


public final class ScheduledExecutorServiceDemo { 
    private static final ScheduledExecutorService exec = 
     Executors.newScheduledThreadPool(2); 

    public static void main(String[] args){ 
     // Schedule first task 
     exec.scheduleAtFixedRate(new Runnable(){ 
      @Override 
      public void run() { 
       // do stuff 
      }}, 0, 1, TimeUnit.MINUTES); 

     // Schedule second task 
     exec.scheduleAtFixedRate(new Runnable(){ 
      @Override 
      public void run() { 
       // do stuff 
      }}, 0, 1, TimeUnit.HOURS); 
    } 
} 
+0

这个例子告诉你需要完成笏。 http://gallemore.blogspot.com/2007/05/java-threading-scheduledexecutorservice.html快乐编码! – cheekoo

+0

@ user877333,另请参阅:[Executors](http://download.oracle.com/javase/tutorial/essential/concurrency/executors.html)教程。 – mre

到目前为止做得很好! :)

你可以再次做同样的事情。我的意思是说,你创建了一个代表你的第二个线程的新类(我们可以称这个类为SecondListener)。它应该看起来像OrderListener,但睡眠时间应该改变为1小时。

然后您只需修改您的主要方法,以便它创建SecondListener类的一个对象,并像启动OrderListener一样启动线程。

如果SecondListener在第一次运行之前不运行第一次运行是很重要的,那么您可以在SecondListener的进程之前执行睡眠。

最后还有一个关于睡眠时间的小建议:为了可读性,将它们表达为方程式。因此,而不是60000,输入1000 * 60.而不是3600000类型1000 * 60 * 60 :)

+0

如果第一个process()方法需要50秒执行,该怎么办?上述程序是否按预期行事? – cheekoo

+0

的确,我同意可读性。 – WillHaack

+0

@cheekoo是的,它会继续工作,当你开始一个新的线程时,你会得到一个新的进程。你有2个进程运行第二个不关心是否第一个完成。 – WillHaack