如何使用Timer类调用方法,做某事,重置计时器,重复?

2022-09-01 07:17:58

我是一个Java初学者,一直在为这个问题的各种解决方案而努力,并且已经让自己有点纠结。我尝试过使用Threads,然后发现了这个Timer类,并且到目前为止一直搞砸了它,但没有成功。如果你可以用一个main方法发布可执行代码,这样我就能看到它的工作原理,并从那里开始玩,那就太好了。

  1. 启动计划
  2. doSomething()
  3. 生成随机数并为该长设置计时器。
  4. 当计时器关闭时,再次呼叫。doSomething()

可能使用这个:http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html


答案 1

如果你想简单地使用Timer,我会做这样的事情:

public class TestClass {
    public long myLong = 1234;

    public static void main(String[] args) {
        final TestClass test = new TestClass();

        Timer timer = new Timer();
        timer.schedule(new TimerTask() {

            @Override
            public void run() {
                test.doStuff();
            }
        }, 0, test.myLong);
    }

    public void doStuff(){
        //do stuff here
    }
}

抱歉标识不好。

另外,如果你需要安排代码的执行,看看Guava Services,因为它可以真正让你的代码更清晰,并抽象出相当多的创建线程,调度等样板。

顺便说一句,我没有费心生成随机数等,但我认为你可以弄清楚如何包含该部分。我希望这足以让你走上正确的轨道。

根据记录,如果您要使用番石榴,它将看起来像这样:

class CrawlingService extends AbstractScheduledService {

    @Override
    protected void runOneIteration() throws Exception {
        //run this alot
    }

    @Override
    protected void startUp() throws Exception {
        //anything you need to step up
    }

    @Override
    protected void shutDown() throws Exception {
        //anything you need to tear down
    }


    @Override
    protected Scheduler scheduler() {
        return new CustomScheduler() {
            @Override
            protected Schedule getNextSchedule() throws Exception {
                long a = 1000; //number you can randomize to your heart's content
                return new Schedule(a, TimeUnit.MILLISECONDS);
            }
        };
    }
}

你只需创建一个名为new CrawlingService.start()的主节点即可。就是这样。


答案 2

你特别想要一个?如果不是,您可能最好使用 ScheduledExecutorService 并呼叫或 ;引用Javadocs的话:TimerscheduleAtFixedRatescheduleWithFixedDelay

Java 5.0引入了该软件包,其中的并发实用程序之一是线程池,用于以给定的速率或延迟重复执行任务。它实际上是/ 组合的更通用的替代品,因为它允许多个服务线程,接受各种时间单位,并且不需要子类化(只需实现)。使用一个线程进行配置使其等效于 。java.util.concurrentScheduledThreadPoolExecutorTimerTimerTaskTimerTaskRunnableScheduledThreadPoolExecutorTimer

更新

下面是一些使用的工作代码:ScheduledExecutorService

import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Test {
    public static void main(String[] args) {
        final ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
        ses.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                System.out.println(new Date());
            }
        }, 0, 1, TimeUnit.SECONDS);
    }
}

输出如下所示:

Thu Feb 23 21:20:02 HKT 2012
Thu Feb 23 21:20:03 HKT 2012
Thu Feb 23 21:20:04 HKT 2012
Thu Feb 23 21:20:05 HKT 2012
Thu Feb 23 21:20:06 HKT 2012
Thu Feb 23 21:20:07 HKT 2012