2012-04-03 26 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

あなたは何をしようとしていますか? 2番目の方法では、非同期的に\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

あなたは、あなたがそれを作成したJavaプロセスよりも長生きするために作成する仕事をしたい場合は、あなたが別のプロセスを起動する必要があります。 Commons execは、Javaからのプロセスの起動が最初に表示されるほど単純ではないので、そのことを助けることができます。

スレッドをデーモンとして設定すると、プロセスが終了し、デーモンスレッドも強制終了され、そのアドレススペースはなくなります。

関連する問題