2017-05-27 144 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()設置目標線程的中斷標誌。 然後,在該目標線程中運行的代碼可以輪詢中斷的 狀態並進行適當的處​​理。阻斷如 Object.wait()一些方法可立即食用的中斷狀態,並拋出 適當的異常(通常InterruptedException

中斷在Java中不先發制人。換句話說,兩個線程 必須配合才能正確處理中斷。如果 目標線程不輪詢中斷狀態,則有效忽略中斷 。

輪詢通過Thread.interrupted()方法發生,該方法返回 當前線程的中斷狀態並清除該中斷標誌。 通常情況下,線程可能會執行某些操作,如throw InterruptedException

這意味着Sikuli wait可能無法正確處理中斷(不輪詢中斷狀態)並保持正常運行。

相關問題