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?