Java-在线程

时间:2018-11-19 17:32:59

标签: java multithreading javafx webview

我正在尝试在WebView上执行javascript并获取输出。可以,但是尝试在线程中执行此操作时出现错误:

@FXML
private void handleButtonAction(ActionEvent event) throws InterruptedException {

int x = this.test();
System.out.print(x);
}    



private int test()
{
    return (Integer) engine.executeScript("function x(){return 3}; x();");
}

给出输出“ 3”并且没有抛出异常,但是当我执行时:

public void exampleThread() {

    Thread one = new Thread() {
        public void run() {

            while (true) {
                try {
                    System.out.println("Does it work?");
                    Thread.sleep(1000);

                    int y = test();

                    System.out.println("Nope: "+y);
                } catch (InterruptedException v) {
                    System.out.println(v);
                }
            }
        }
    };

    one.start();
}

它抛出:

  

线程“ Thread-12”中的异常java.lang.IllegalStateException:在FX应用程序线程上不; currentThread =线程12       在com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:279)       在com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:423)       在javafx.scene.web.WebEngine.checkThread(WebEngine.java:1243)       在javafx.scene.web.WebEngine.executeScript(WebEngine.java:1003)       在testApp.FXMLDocumentController.test(FXMLDocumentController.java:91)       在testApp.FXMLDocumentController.access $ 000(FXMLDocumentController.java:28)       在testApp.FXMLDocumentController $ 1.run(FXMLDocumentController.java:76)

有人知道这是怎么回事吗?

1 个答案:

答案 0 :(得分:0)

您正在使用JavaFX内部的WebEngine-它似乎想在JavaFX应用程序线程中运行,这是您在handleButtonAction()中执行事件处理程序时所处的位置-但是在运行时却没有你自己的线程。最简单的解决方案是在JavaFX线程中运行测试方法(查找Platform.invokeLater()?),或者您可以将脚本交给Java中的JavaScript引擎,而不是JavaFX中的脚本引擎(这样可以释放您的精力)不必在JavaFX应用程序线程中运行...)