Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在后台线程中正确停止sikuli?_Java_Multithreading_Sikuli - Fatal编程技术网

Java 如何在后台线程中正确停止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();

我在后台线程中有一个简单的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)
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()