Em qual cenário se tornar vantagem utilizar thread no javafx?

Em qual cenário se tornar vantagem utilizar thread no javafx para melhorar a performance da aplicação?

vou dar um exemplo de uma classe minha em que eu faço uma lista com dados do meu banco de dados, teria como aplicar a thread a isso?

primeiro eu tenho uma tableview na qual eu populo com os itens da minha lista do banco de dados:

  public void initialize(URL url, ResourceBundle rb) {
        initTable();
        tb.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {
            @Override
            public void changed(ObservableValue observable, Object oldValue, Object newValue) {
                selecionada = (Requisicao) newValue;
            }
        });
        txPequisar.setOnKeyReleased((KeyEvent e) -> {
            tb.setItems(buscar());
        });
        btBuscar.setOnMouseClicked((MouseEvent e) -> {
            tb.setItems(buscar());
        });
      checkBoxes = new CheckBox[] {
      checkMonitor,
      checkTeclado,
      checkMouse,
      checkVGA,
      checkPlacaMae,
      checkHD,
      checkFonte,
      checkRam,
      checkCabos,
      checkGravador,
      checkBateria
        };  
      checkBoxesServicos = new CheckBox[] {
      checkComponente,
      checkPeriferico,
      checkLimpezaF,
      checkLimpezaS,
      checkRoteador,
      checkBackup,
      checkFormatar,
      checkImpressoras
        }; 
    }

    public void initTable() {

        clmIdReq.setCellValueFactory(new Callback<CellDataFeatures<Requisicao, Long>, ObservableValue<Long>>() {
            public ObservableValue<Long> call(CellDataFeatures<Requisicao, Long> requisicao) {
                return new SimpleObjectProperty(requisicao.getValue().getId());
            }
        });
        clmEquipamento.setCellValueFactory(new Callback<CellDataFeatures<Requisicao, String>, ObservableValue<String>>() {
            public ObservableValue<String> call(CellDataFeatures<Requisicao, String> requisicao) {
                return new SimpleObjectProperty(requisicao.getValue().getReqEquipamento().getEquipamento_nome());
            }
        });
        clmSerial.setCellValueFactory(new Callback<CellDataFeatures<Requisicao, String>, ObservableValue<String>>() {
            public ObservableValue<String> call(CellDataFeatures<Requisicao, String> requisicao) {
                return new SimpleObjectProperty(requisicao.getValue().getReqEquipamento().getSerial_equipamento());
            }
        });
        clmRequisitante.setCellValueFactory(new Callback<CellDataFeatures<Requisicao, String>, ObservableValue<String>>() {
            public ObservableValue<String> call(CellDataFeatures<Requisicao, String> requisicao) {
                return new SimpleObjectProperty(requisicao.getValue().getReqUsuario().getNome());
            }
        });
        clmObservacao.setCellValueFactory(new Callback<CellDataFeatures<Requisicao, String>, ObservableValue<String>>() {
            public ObservableValue<String> call(CellDataFeatures<Requisicao, String> requisicao) {
                return new SimpleObjectProperty(requisicao.getValue().getMotivo());
            }
        });
        clmStatus.setCellValueFactory(new Callback<CellDataFeatures<Requisicao, String>, ObservableValue<String>>() {
            public ObservableValue<String> call(CellDataFeatures<Requisicao, String> requisicao) {
                return new SimpleObjectProperty(requisicao.getValue().getReqStatus().getCategoria());
            }
        });
        clmData.setCellValueFactory(new Callback<CellDataFeatures<Requisicao, Timestamp>, ObservableValue<Timestamp>>() {
            public ObservableValue<Timestamp> call(CellDataFeatures<Requisicao, Timestamp> requisicao) {
                return new SimpleObjectProperty(requisicao.getValue().getData_criada());
            }
        });
        tb.setItems(atualizarTabela());

    } 

Aqui eu chamo meu metodo que pega os dados do bd e cria uma lista:

public ObservableList<Requisicao> atualizarTabela() {
    RequisicaoDAO dao = new RequisicaoDAO();
    requisicoes = FXCollections.observableArrayList(dao.getList());
    return requisicoes;
}

o meu DAO que faz a lista com o resultset:

  public List<Requisicao> getList() {
        List<Requisicao> requisicoes = new ArrayList<>();
        String sql = "SELECT * FROM equipamento_requisicao equipreq INNER JOIN equipamento_user equipuser ON (equipreq.idequipamento_user = equipuser.id_equipamento_do_usuario)  INNER JOIN usuario user ON (user.id_usuario=equipuser.idusuario) INNER JOIN equipamentos equip ON (equip.id_equipamentos = equipuser.idequipamentos) INNER JOIN detalhe_status dStatus ON (dStatus.idequipamento_requisicao= equipreq.id_equipamento_requisicao) INNER JOIN status_requisicao statusreq on (statusreq.id_status= dStatus.idstatus) INNER JOIN permissao p ON(user.idpermissao= p.id_permissao) INNER JOIN departamentos dp ON(user.iddepartamento = dp.id_departamentos) INNER JOIN chefe_departamento cp ON(dp.id_chefe = cp.id_chefe) where statusreq.categoria='Ativa' ";
        try {
            PreparedStatement stmt = con.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {       

                Usuario usuario = new Usuario();
                usuario.setNome(rs.getString("user.nome"));
                usuario.setId(rs.getLong("user.id_usuario"));
                usuario.setMatricula(rs.getString("user.matricula"));
                // FIM TABELA USUARIO               
                //equipamento // equipamento user tabelas
                Equipamentos equipamento = new Equipamentos();
                equipamento.setEquipamento_nome(rs.getString("equip.equipamento_nome"));
                equipamento.setSerial_equipamento(rs.getString("equipuser.serial_equipamento"));
                equipamento.setId_equipamento_do_Usuario(rs.getLong("equipreq.idequipamento_user"));
                //status tabela
                Status status = new Status();
                status.setCategoria(rs.getString("statusreq.categoria"));
                status.setIdstatus(rs.getInt("statusreq.id_status"));
                //status detalhes tabela
                Usuario usuarioStatus = new Usuario();//id do usuaro na tabela detalhes status
                usuarioStatus.setId(rs.getLong("dStatus.idusuario"));
                StatusDetalhes statusDetalhes = new StatusDetalhes();
                statusDetalhes.setId_statusdetalhes(rs.getLong("dStatus.id_statusdetalhes"));
                statusDetalhes.setData_status(rs.getTimestamp("dStatus.data"));
                statusDetalhes.setObservacao_status(rs.getString("dStatus.observacao"));
                statusDetalhes.setIdUsuario(usuarioStatus);
                statusDetalhes.setIdStatus(status);
                // Id da requisicao na tabela detalhes status
                Requisicao requisicaoStatus = new Requisicao();
                requisicaoStatus.setId(rs.getLong("dStatus.idequipamento_requisicao"));
                //requisicao tabela
                Requisicao req = new Requisicao();
                req.setId(rs.getLong("equipreq.id_equipamento_requisicao"));
                req.setNome(rs.getString("equipreq.nome"));
                req.setData_criada(rs.getTimestamp("equipreq.data_requisicao"));
                req.setMotivo(rs.getString("equipreq.observacao"));
                req.setReqEquipamento(equipamento);
                req.setReqStatus(status);
                req.setReqUsuario(usuario);
                req.setReqStatus_Detalhes(statusDetalhes);
                requisicoes.add(req);
            }
            stmt.close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(RequisicaoDAO.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }

        return requisicoes;
    }

Aqui eu tenho um metodo nessa tela que eu faço um insert no banco de dados de acordo com os checkbox selecionados e a requisição selecionada da minha tableview

  public void xd() throws SQLException{
        List<Integer> pecasList = new ArrayList<>();
        for (int i = 0; i < checkBoxes.length; i++) {
            if (checkBoxes[i].isSelected()) {
                pecasList.add(i+1);
            }
        }   
        List<Integer> servicosList = new ArrayList<>();
        for (int i = 0; i < checkBoxesServicos.length; i++) {
            if (checkBoxesServicos[i].isSelected()) {
                servicosList.add(i+1);
            }
        }         
        Alert alert = new Alert(AlertType.INFORMATION);
        List<Pecas> pecasCEstoque = new ArrayList<>();    
        PecasDAO pecas = new PecasDAO();
        Alerts alerts = new Alerts();
        String motivo = txtMotivo.getText();
        RequisicaoDAO requisicaoDAO = new RequisicaoDAO();
        if(selecionada!= null){
        requisicaoDAO.verificarStatus(selecionada);
        for (Pecas checarQtd : pecas.pegarPecasById(pecasList)){
            if(checarQtd.getQtd_Pecas()>0){
                Pecas pecasEstoque = new Pecas();
                pecasEstoque.setIdpecas(checarQtd.getIdpecas());
                pecasEstoque.setNome(checarQtd.getNome());
                pecasEstoque.setQtd_Pecas(checarQtd.getQtd_Pecas());
                pecasCEstoque.add(pecasEstoque);
            }else{
                alert.setTitle("Error Dialog");
                alert.setHeaderText("Look, an Error Dialog");
                alert.setContentText("Não temos estoque de: " +checarQtd.getNome());
                alert.showAndWait();
            }
        }
        if(selecionada.getReqStatus().getIdstatus() == 1){
            if(requisicaoDAO.inserir(servicosList, selecionada, motivo, pecasCEstoque)){
            atualizarTabela();
            alerts.alertReqCadastrado();
            } 
            else{
            alerts.alertReqNCadastrado();
            }
        }
        else{
            alerts.reqFechada();
        }
    
        }else{
            alerts.selecionarRequisicao();
        }
    }

Eu queria entender um pouca mais sobre como utilizar o thread e se teria como utilizar em alguma parte desse meu codigo para melhorar a peformace?

Uma das utilidades é para processar requisições em segundo plano e não travar a thread principal, por exemplo, quando o usuário executa uma ação que demora um pouco mais e o sistema apresenta um “loading”.