2012-04-03 2 views
0

현재 메서드를 차단하지 않고 일정 시간이 지나면 코드를 실행해야합니다. 자바 지연 메서드 실행

가 나는 다음 두 방법을 시도 :

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

무엇을하려고합니까? 두 번째 방법은 \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를, 함께 실행 프로그램을 만드는 것입니다. 당신은 당신이 그것을 만든 자바 프로세스를보다 오래하기 위해 만드는 작업을하려면

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

데몬 스레드로 설정하면 코드를 호출 한 후 바로 앱이 종료됩니다. -> 스레드가 10 초 안에 무언가를 실행해야한다면, 그 시점에서 스레드가 더 이상 존재하지 않습니다. –

+1

나는 그것이 끝날 때까지 메인이 빠져 나가는 것을 허락하지 않는다는 당신의 소원이라고 생각했다. 내 예제에서는 myThread.start() 이후 아무것도하지 않습니다. 실제 응용 프로그램에서는 mainThread (또는 다른 비 데몬 스레드)에서 아무 것도 할 수 있습니다. setDAemon (true)을 생략 할 수 있습니다. 앱이 System.out 후에 종료됩니다. – Andreas

0

는, 당신은 다른 프로세스를 시작해야합니다 : 당신은이 기능을 사용합니다. Commons exec이 도움이 될 수 있습니다. java에서 프로세스를 시작하는 것이 처음 나타나는 것처럼 간단하지 않기 때문입니다.

스레드를 데몬으로 설정하면 프로세스가 종료되고 데몬 스레드도 종료되어 주소 공간이 사라집니다.