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

时间:2011-08-18 21:14:50

标签: java multithreading

我有一种情况每分钟运行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应该每小时启动一次)

3 个答案:

答案 0 :(得分:11)

我建议您使用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);
    }
}

答案 1 :(得分:2)

到目前为止做得好! :)

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

然后你只需要修改你的main方法,这样就可以创建一个SecondListener类的对象,并启动线程,就像你使用OrderListener一样。

如果重要的是SecondListener在第一次运行之前没有运行它,直到一小时之后,你可以在SecondListener中的进程之前执行sleep。

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

答案 2 :(得分:1)

使用线程类的更好方法是创建一个实现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);
        }
      }
    }