2012-04-03 2 views
0

Мне нужно запустить некоторый код через определенный промежуток времени, не блокируя текущий метод.Запуск метода задержки Java

Я попытался следующие 2 подхода:

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"); 
} 

Проблема заключается в том, что первый блок делает приложение и второй не позволяет основной для выхода, пока он не закончит;

Как запустить код через некоторое время и выйти из текущего метода сразу после его планирования?

+0

Что вы пытаетесь сделать? Второй подход _will_ запускает \t асинхронно, т. Е. Не блокирует ваши методы! – Anthales

ответ

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, в котором вы установили созданную тему, как Daemon. Вы должны использовать эти функции:

Excecutors.newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory) 
+1

, создавая поток демона, сделает выход приложения сразу после вызова кода; -> Если поток должен запускать что-то за 10 секунд, в этом случае он больше не существует. –

+1

Я думал, что это ваше желание («а второе не позволяет основному выйти, пока он не закончится»). В моем примере я ничего не делаю после myThread.start(). В приложении реального мира может быть сделано что-либо в mainThread (или в других потоках без Daemon). Вы можете отказаться от setDAemon (правда). Чем приложение выйдет после System.out. – Andreas

0

Если вы хотите работу вы создаете переживет процесс Java, который создал его, то вам придется запустить другой процесс. Commons exec может помочь в этом, так как запуск процесса из java не так прост, как может показаться на первый взгляд.

Если вы установили поток в качестве демона, то ваш процесс завершится, тогда поток демона также будет убит - его адресное пространство ушло.

Смежные вопросы