2012-05-09 2 views
1

私のプログラムでは、キーを押すと停止する機能があります。私はその目的のために設定されたネイティブのキーボードフックを持っています。今、私はSystem.exit(0)を呼び出すときにそのキーが検出されます。しかし、私はプログラムを終了し、その操作を停止し、呼び出された場所に戻るだけではありません。例を以下に示します。Javaのキー押下で関数の実行を戻したり停止したりする

public class Main { 
    public static void main(String[] args) { 
     System.out.println("Calling function that can be stopped with CTRL+C"); 
     foo(); // Should return when CTRL+C is pressed 
     System.out.println("Function has returned"); 
    } 
} 

私はので、私はThread.interrupt()を呼び出すことができますが、私は関数呼び出しではなく、非ブロッキングを阻止したいスレッド内のfoo()への呼び出しを入れて試してみました。また、foo()にIOコールをブロックしているので、必要がないかぎり割り込みを処理しないでください。ClosedByInterruptException例外を処理しなければならず、問題が発生しています。

foo()の本体も非常に長く、内部に多くの関数呼び出しがあるため、関数内にif (stop == true) return;を記述することはオプションではありません。

これを行うには、ブロッキングスレッドを作成するよりも良い方法はありますか?もしそうなら、どうですか?そうでない場合は、どのようにスレッドをブロックするのですか?

+0

あなたの質問は不明である(http://www.exampledepot.com/egs/java.lang/PauseThread.htmlなく、私自身の仕事から撮影します)。その時点で何が行われていても、キーが押されていても、 'foo()'をすぐに返すようにしたいのですか?あなたは 'foo'がI/O呼び出しをブロックしていると言っています...' foo'がキーを押したときにブロック呼び出し中であれば、すぐに中断しますか? –

+0

いいえ、私はすぐに中断させたいです。私が言及したとき、私は別の例外( 'ClosedByInterruptException')をどのように捕らえなければならないのか考えていました。しかし、私はそれが何をしているにせよそれを止めることを間違いなく望んでいます。私はポストでそれを明らかにした。 – gsingh2011

+0

英語では、「いいえ、***はほしくない」、「はい、***は***したい...」のいずれかです。あなたの返信は依然としてあいまいです。明らかにしてください。 –

答えて

1

これはいかがですか?

// Create and start the thread 
MyThread thread = new MyThread(); 
thread.start(); 

while (true) { 
    // Do work 

    // Pause the thread 
    synchronized (thread) { 
     thread.pleaseWait = true; 
    } 

    // Do work 

    // Resume the thread 
    synchronized (thread) { 
     thread.pleaseWait = false; 
     thread.notify(); 
    } 

    // Do work 
} 

class MyThread extends Thread { 
    boolean pleaseWait = false; 

    // This method is called when the thread runs 
    public void run() { 
     while (true) { 
      // Do work 

      // Check if should wait 
      synchronized (this) { 
       while (pleaseWait) { 
        try { 
         wait(); 
        } catch (Exception e) { 
        } 
       } 
      } 

      // Do work 
     } 
    } 
} 

関連する問題