2016-08-07 12 views
-1

私はすでに言及したように、私はプログラミングの世界ではかなり新しいです。 私は現在、実行可能な問題に直面しています。ブール・シャットダウンの状態を確認するとき、コードは30秒ごとに実行されるのではなく、常時実行されています。これまで マイコード:Java - 実行可能な混乱

import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 

public class TestClass { 
static boolean shutdown; 


public static void main(String[] args) { 


    notify(30); 
} 

private static void notify(int num) { 

    Runnable runner = new Runnable() { 
     public void run() { 
      while(!shutdown){ 
      System.out.println("running"); 
     } 
    } 
    }; 

    ScheduledExecutorService exec = Executors.newScheduledThreadPool(1); 
    exec.scheduleAtFixedRate(runner, 0, num, TimeUnit.SECONDS); 
} 

} 

編集:私はブールシャットダウンを使用している理由です、実行中から方法を停止するために何とかする必要があります。

+3

whileループを削除します。 – beatngu13

+0

@ beatngu13実際には私はwhileループが必要です。何とか実行を止めたいからです。だから私はそれが実行する必要があるかどうかを制御するブール値を得ることを考えました。 –

+1

Executorサービスは30秒ごとに 'run()'を呼び出し、メソッドの終わりに達すると自動的に実行を停止します。あなたがしようとしていることではありませんか? – beatngu13

答えて

2

whileループによって、スレッドは永遠に回転しなくなります。これが実行されると、あなたのコンピュータは100%のコア使用率を示しているはずです。

ScheduledExecutorService.scheduleAtFixedRateは、ScheduledFuture<?>オブジェクトを返します。あなたがする必要があるのは、cancel()を呼び出してタスクの実行を停止することです。

whileループを削除してScheduledFuture<?>をキャンセルする必要があります。

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html

私はメモ帳にこれを入力した - それはおそらくコンパイルされませんが、あなたはアイデアを得る必要があります。

import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 

public class TestClass { 
static ScheduledExecutorService exec = Executors.newScheduledThreadPool(1); 
static boolean shutdown = false; 


public static void main(String[] args) throws Exception { 
    new ShutdownChecker(30); 
    Thread.sleep(90_000); 
    shutdown = true; 
} 

private static class ShutdownChecker implements Runnable 
{ 
    private final ScheduledFuture<?> future; 

    public ShutdownChecker(int time) 
    { 
     future = TestClass.exec.scheduleAtFixedRate(this, 0, num, TimeUnit.SECONDS); 
    } 

    public void run() 
    { 
     if(TestClass.shutdown) 
     { 
      future.cancel(); 
      System.out.println("not running"); 
      return; 
     } 

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

} 
+0

スニペットを私に提供できますか? –

+0

ありがとうございます。それはトリックでした! –

-1

ScheduledExecutorServiceは、Runnableインスタンスを指定期間後にThreadPoolから利用可能なThreadに渡します。

+0

私はそれを知っていますが、私が達成しようとしているのはそれをやめることです。 –

+0

ブール値のステータスを監視するにはもう1つスレッドが必要です。ブール値がtrueの場合は、ScheduledExecutorServiceを停止します。 –

+0

エグゼキュータは、各期間の後に新しいスレッドを生成しません。それを読む[ここ](http://stackoverflow.com/questions/2324030/java-thread-reuse)。 – beatngu13