2017-05-27 14 views
2

は、私は、バックグラウンドスレッドでは、単純なsikuliウェイト動作を持っています。バックグラウンドスレッドでsikuliを正しく停止するにはどうすればいいですか?

public static void main(String[] args) { 
    Runnable rn =() -> { 
     Screen s = new Screen(); 
     try { 
      s.wait(imgPattern, 5); 
     } catch (FindFailed e) { 
      e.printStackTrace(); 
     } 
     System.out.println("Finished wait."); 
    }; 

    Thread th = new Thread(rn); 
    th.start(); 

    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException e1) { 
    } 

    th.interrupt(); 
    try { 
     th.join(); 
    } catch (InterruptedException e) { 
    } 
    System.out.println("Finished main."); 
} 

私は中断し、私はjava.lang.InterruptedExceptionを得たバックグラウンドスレッドを停止しようとするが、sikuliはまだ動作します。これはプログラムの出力です:

java.lang.InterruptedException: sleep interrupted 
    at java.lang.Thread.sleep(Native Method) 
    at java.awt.Robot.delay(Unknown Source) 
    at org.sikuli.script.RobotDesktop.delay(RobotDesktop.java:240) 
    at java.awt.Robot.autoDelay(Unknown Source) 
    at java.awt.Robot.afterEvent(Unknown Source) 
    at java.awt.Robot.mouseMove(Unknown Source) 
    at org.sikuli.script.RobotDesktop.doMouseMove(RobotDesktop.java:61) 
    at org.sikuli.script.RobotDesktop.smoothMove(RobotDesktop.java:165) 
    at org.sikuli.script.RobotDesktop.smoothMove(RobotDesktop.java:145) 
    at org.sikuli.script.Mouse.move(Mouse.java:361) 
    at org.sikuli.script.Mouse.move(Mouse.java:331) 
    at org.sikuli.script.Mouse.init(Mouse.java:60) 
    at org.sikuli.script.Screen.initScreens(Screen.java:107) 
    at org.sikuli.script.Screen.<clinit>(Screen.java:72) 
    at SikuliTest.lambda$0(SikuliTest.java:12) 
    at java.lang.Thread.run(Unknown Source) 

FindFailed:  /C:/imgPatternPath.png: (18x14) in S(0)[0,0 1366x768] E:Y, T:3,0 
    Line 2759, in file Region.java 

    at org.sikuli.script.Region.wait(Region.java:2759) 
Finished wait. 
Finished main. 
    at SikuliTest.lambda$0(SikuliTest.java:14) 
    at java.lang.Thread.run(Unknown Source) 

私は正しくsikuliの動作を停止しますか?

答えて

1

割り込みがどのように機能するかについて、いくつかの混乱が生じるかもしれません。 thisからの返答、

Thread.interrupt()ターゲットスレッドの中断フラグを設定します。 そのターゲットスレッドで実行されているコードは、中断された ステータスをポーリングし、適切に処理することができる(MAY)。例えば Object.wait()、ブロックいくつかの方法は、(通常InterruptedException

を適切な例外を直ちに中断ステータスを消費し をスローすることができるJavaで中断はプリエンプティブではありません。別の言い方をすれば、両方のスレッド は、割り込みを適切に処理するために協力しなければならない。 ターゲットスレッドが割り込みステータスをポーリングしない場合、割り込みは が実質的に無視されます。

現在のスレッドの割り込みステータスを返し、その割り込みフラグをクリアするThread.interrupted()メソッド経由でポーリングが発生します。 通常、スレッドは、 InterruptedExceptionのようなものを実行します。

これは、Sikuli waitがおそらく割り込みを正しく処理しない(中断された状態をポーリングしない)ことを意味し、正常に動作し続けます。

関連する問題