Java延迟方法运行

时间:2012-04-03 09:59:10

标签: java timer scheduled-tasks task

我需要在一段时间后运行一些代码,而不会阻止当前的方法。

我尝试了以下两种方法:

public static void main(final String[] args) {

    System.out.println("Start");

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

        @Override
        public void run() {

            System.out.println("done");
            this.cancel();

        }
    }, 4000L);

    ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
    executor.schedule(new Runnable() {
        public void run() {
            System.out.println("done");
        }
    }, 2, TimeUnit.SECONDS);
    executor.shutdown();

    System.out.println("Stop");
}

问题是第一个会阻止应用程序,第二个不允许main在完成之前退出;

如何在一段时间后运行代码并在安排后立即退出当前方法?

4 个答案:

答案 0 :(得分:0)

您可以创建自己的线程并将其设置为守护程序:

        final Thread myThread = new Thread(new Runnable() {

        @Override
        public void run() {
            try {
                Thread.sleep(20000);
            } catch (final InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("20 seconds over");

        }
    });
    myThread.setDaemon(true);
    myThread.start();

另一种方法是使用ThreadFactory创建Executor,在其中将创建的Thread设置为守护进程。你必须使用这些功能:

Excecutors.newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory) 

答案 1 :(得分:0)

如果您希望创建的作业比创建它的Java进程更长,那么您将不得不启动另一个进程。 Commons exec可以提供帮助,因为从java启动进程并不像第一次出现那么简单。

如果将线程设置为守护进程然后进程退出,则守护程序线程也将被终止 - 其地址空间消失。

答案 2 :(得分:0)

答案 3 :(得分:0)

使用预定执行人: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html

它有一个计划方法,一个固定费率方法的计划和一个固定延迟方法的计划。