Java 如何在后台线程中正确停止sikuli?
我在后台线程中有一个简单的sikuli等待操作:Java 如何在后台线程中正确停止sikuli?,java,multithreading,sikuli,Java,Multithreading,Sikuli,我在后台线程中有一个简单的sikuli等待操作: public static void main(String[] args) { Runnable rn = () -> { Screen s = new Screen(); try { s.wait(imgPattern, 5); } catch (FindFailed e) { e.printStackTrace();
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)
java.lang.InterruptedException:睡眠中断
位于java.lang.Thread.sleep(本机方法)
位于java.awt.Robot.delay(未知源)
位于org.sikuli.script.RobotDesktop.delay(RobotDesktop.java:240)
位于java.awt.Robot.autoDelay(未知源)
位于java.awt.Robot.afterEvent(未知源)
位于java.awt.Robot.mouseMove(未知源代码)
位于org.sikuli.script.RobotDesktop.doMouseMove(RobotDesktop.java:61)
位于org.sikuli.script.RobotDesktop.smoothMove(RobotDesktop.java:165)
位于org.sikuli.script.RobotDesktop.smoothMove(RobotDesktop.java:145)
位于org.sikuli.script.Mouse.move(Mouse.java:361)
位于org.sikuli.script.Mouse.move(Mouse.java:331)
位于org.sikuli.script.Mouse.init(Mouse.java:60)
位于org.sikuli.script.Screen.initScreens(Screen.java:107)
在org.sikuli.script.Screen.(Screen.java:72)
在SikuliTest.lambda$0(SikuliTest.java:12)
位于java.lang.Thread.run(未知源)
S(0)[0,0 1366x768]E:Y,T:3,0中的FindFailed:/C:/imgPatternPath.png:(18x14)
第2759行,在Region.java文件中
位于org.sikuli.script.Region.wait(Region.java:2759)
完成等待。
完工的主管道。
在SikuliTest.lambda$0(SikuliTest.java:14)
位于java.lang.Thread.run(未知源)
如何正确地阻止sikuli工作?关于中断如何工作,可能会有一些混淆。引述答案,
Thread.interrupt()
设置目标线程的中断标志。
然后,在该目标线程中运行的代码可能会轮询被中断的线程
状态,并妥善处理。一些阻止的方法,例如
Object.wait()
可能会立即使用中断状态并抛出
适当的异常(通常为中断异常
)
Java中的中断不是先发制人的。换句话说,两条线
必须配合才能正确处理中断。如果
目标线程不轮询中断时的中断状态
实际上被忽视了
轮询通过返回
当前线程的中断状态并清除该中断标志。
通常线程可能会执行一些操作,例如抛出
中断异常
这意味着Sikuli
wait
可能无法正确处理中断(不轮询中断状态)并保持正常运行。实际上,Sikuli使用的是Robot.delay()
,与Thread.sleep()
不同,它忽略了中断异常
您可以创建一个进程来运行Sikuli automation,您可以通过调用sikuliProcess.destroy()