【问题标题】:Java delay method runJava延迟方法运行
【发布时间】:2012-04-16 23:20:57
【问题描述】:

我需要在不阻塞当前方法的情况下运行一段时间后运行一些代码。

我尝试了以下两种方法:

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 退出,直到它完成;

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

【问题讨论】:

  • 你想做什么?第二种方法异步运行,即不会阻塞您的方法!

标签: java timer scheduled-tasks task


【解决方案1】:

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

        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 设置为 Daemon。您必须使用这些功能:

Excecutors.newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory) 

【讨论】:

  • 使其成为守护线程将使应用程序在调用代码后立即退出; --> 如果线程需要在 10 秒内运行某些东西,那么它就不再存在了。
  • 我认为这是你的愿望('第二个不允许 main 退出,直到它完成;')。在我的示例中,我在 myThread.start() 之后什么都不做。在现实世界的应用程序中,可以在 mainThread(或其他非守护线程)中执行任何操作。您可以省略 setDAemon(true)。比应用程序将在 System.out 之后退出。
【解决方案2】:

如果您希望您创建的作业比创建它的 java 进程寿命更长,那么您将不得不启动另一个进程。 Commons exec 可以帮助解决这个问题,因为从 java 启动进程并不像最初看起来那么简单。

如果您将线程设置为守护进程,那么您的进程将退出,那么守护线程也将被杀死 - 它的地址空间消失了。

【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

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

      它有一个时间表方法,一个固定速率的时间表方法和一个固定延迟的时间表方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-23
        相关资源
        最近更新 更多