使用线程发出数据库请求

使用线程发出数据库请求

我试图了解线程在java中是如何工作的。这是一个返回ResultSet的简单数据库请求。我在使用JavaFX。

    package application;import java.sql.ResultSet;import java.sql.SQLException;import javafx.fxml.FXML;import javafx.scene.control.Button;
    import javafx.scene.control.Label;import javafx.scene.control.TextField;public class Controller{
    @FXML
    private Button getCourseBtn;
    @FXML
    private TextField courseId;
    @FXML
    private Label courseCodeLbl;
    private ModelController mController;

    private void requestCourseName(){
        String courseName = "";
        Course c = new Course();
        c.setCCode(Integer.valueOf(courseId.getText()));
        mController = new ModelController(c);
        try {
            ResultSet rs = mController.<Course>get();
            if(rs.next()){
                courseCodeLbl.setText(rs.getString(1));
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }//      return courseName;
    }

    public void getCourseNameOnClick(){
        try {//              courseCodeLbl.setText(requestCourseName());
            Thread t = new Thread(new Runnable(){
                public void run(){
                    requestCourseName();
                }
            }, "Thread A");
            t.start();
        } catch (NumberFormatException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }}

这将返回一个异常:

线程“Thread A”中的异常java.lang.IllegalStateException:不在FX应用程序线程上;currentThread=Thread A

如何正确地实现线程处理,以便在第二个线程而不是主线程中执行每个数据库请求?

我听说过实现Runnable,但是如何在Run方法中调用不同的方法呢?

以前从来没有用过线程,但我想是时候开始了。


红糖糍粑
浏览 520回答 3
3回答

慕尼黑的夜晚无繁华

线程“Thread A”中的异常java.lang.IllegalStateException:不在FX应用程序线程上;currentThread=Thread A例外情况是试图告诉您,您正在尝试访问JavaFX应用程序线程之外的JavaFX场景图。但在哪里?courseCodeLbl.setText(rs.getString(1));&nbsp;//&nbsp;<---&nbsp;The&nbsp;culprit如果我不能这样做,我如何使用背景线程?这是不同的方法,导致类似的解决方案。用Platform.runLater包装场景图元素有一种更简单、最简单的方法是将上面的行封装在Plaform.runLater,以便在JavaFX应用程序线程上执行。Platform.runLater(()&nbsp;->&nbsp;courseCodeLbl.setText(rs.getString(1)));使用任务这个更好的方法与这些场景一起使用的方法是任务,它具有发送更新的专门方法。在下面的示例中,我将使用updateMessage更新消息。此属性绑定到courseCodeLblTextPropertyTask<Void>&nbsp;task&nbsp;=&nbsp;new&nbsp;Task<Void>()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Void&nbsp;call()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;courseName&nbsp;=&nbsp;""; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Course&nbsp;c&nbsp;=&nbsp;new&nbsp;Course(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.setCCode(Integer.valueOf(courseId.getText())); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mController&nbsp;=&nbsp;new&nbsp;ModelController(c); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;mController.<Course>get(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(rs.next())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;update&nbsp;message&nbsp;property &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateMessage(rs.getString(1)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;}}public&nbsp;void&nbsp;getCourseNameOnClick(){ &nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;t&nbsp;=&nbsp;new&nbsp;Thread(task); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;To&nbsp;update&nbsp;the&nbsp;label &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;courseCodeLbl.textProperty.bind(task.messageProperty()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.setDaemon(true);&nbsp;//&nbsp;Imp!&nbsp;missing&nbsp;in&nbsp;your&nbsp;code &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.start(); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(NumberFormatException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;&nbsp;&nbsp;}}

HUH函数

这与数据库无关。JavaFX和几乎所有GUI库一样,要求您只使用主UI线程来修改GUI。您需要将数据从数据库传递回主UI线程。使用Platform.runLater()安排在主UI线程中运行的Runnable。public&nbsp;void&nbsp;getCourseNameOnClick(){ &nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Thread(new&nbsp;Runnable(){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;run(){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;courseName&nbsp;=&nbsp;requestCourseName(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Platform.runLater(new&nbsp;Runnable(){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;courseCodeLbl.setText(courseName) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;"Thread&nbsp;A").start();}或者,你可以使用任务.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java
MySQL