Threads no JavaFX

Boa tarde.

Eu tenho uma tela feita em JavaFX que carrega uma tabela do BD e para esta tela não ficar “congelada” eu estou carregando o banco de dados através de outra thread. Gostaria de saber se estou fazendo do modo correto ou se teria um jeito melhor?

Segue o código:
public void carregarTableViewClientes() {

Runnable runnable = () -> {
TelaChequesController.listaCheques = getTodosChequeController();
tvChequeNome.setCellValueFactory(new PropertyValueFactory<>(“nome”));
tvChequeValor.setCellValueFactory(new PropertyValueFactory<>(“valor”));
tvChequeData.setCellValueFactory(new PropertyValueFactory<>(“dataString”));
tvChequeDataBP.setCellValueFactory(new PropertyValueFactory<>(“dataBomParaString”));
tvColunaTerceiro.setCellValueFactory(new PropertyValueFactory<>(“nomeTerceiro”));

observableListCheques = FXCollections.observableArrayList(listaCheques);
tvCheque.setItems(observableListCheques);
};
Thread t = new Thread(runnable);
t.start();
}

Outra dúvida que eu tenho: quando eu inicio o programa eu chamo uma tela de Login e eu fiz um progressbar que fica 100% carregado quando o meu banco de dados manda uma lista pro meu sistema, ex.: eu tenho uma lista de clientes no banco de dados, aí eu faço numa nova thread carregar uma lista no sistema, mas nem uso essa lista, ela só me serve mesmo pra fazer o sistema conectar com o banco de dados, para o usuário não ficar esperando sem saber o que tá acontecendo, eu preciso fazer isso pq sempre na primeira conexão do Hibernate com o BD ele demora um pouco, depois fica rápido para as demais requisições envolvendo BD. Isso está correto? Ou teria uma forma melhor de fazer? Pq pra mim ficou parecendo uma “gambiarra”.

Obrigado.

Thread é pra isso mesmo, é uma solução sempre inteligente para não segurar o processamento.

Em javaFX e’ aconselhado usar Thread/Task.

E se acontecer de dentro de uma Thread precisar chamar coisas da Thread da Application
use

Platform.runLater( () -> {
    ...     
});

Legal amigo. E essas duas soluções que eu encontrei, estão corretas?

Obrigado pelo retorno.

O importante é que com isso você resolveu o problema.Mas usar uma leitura no banco de dados em que você não vai usar esses dados me parece desnecessário. Eu costumo persistir os dados sem o hibernate, mas se com ele é lento na primeira vez, fazê o que né !!!

Pra mim essa não é uma boa pratica.Gosto de ter controle sobre minhas bibliotecas e se as de terceiros estão com problemas de performances, na medida do possível tento criar a minha propria. ( as vezes reinventar a roda faz todo sentido )

Concordo em gênero, número e grau. kkkk
Só me falta experiencia e conhecimento para fazer a reinvenção da roda. kkkk
Existe algum método que retorne a primeira conexão com Hibernate? Para fazer uma thread dar tipo um “OK, hibernate conectou”, sem eu ter que fazer um método que retorne uma lista do BD?

Obrigado pelo retorno.

Infelizmente como Eu não uso hibernate essa vou ficar devendo; mas alguem deve ter passado por algo parecido e poderá dar algumas ideias. A questão tá lançada.

Em relação ao codigo

Task task = new Task<Void>()  {
                   
        @Override
        protected Void call() throws Exception {

              TelaChequesController.listaCheques = getTodosChequeController();
tvChequeNome.setCellValueFactory(new PropertyValueFactory&lt;&gt;(“nome”));
tvChequeValor.setCellValueFactory(new PropertyValueFactory&lt;&gt;(“valor”));
tvChequeData.setCellValueFactory(new PropertyValueFactory&lt;&gt;(“dataString”));
tvChequeDataBP.setCellValueFactory(new PropertyValueFactory&lt;&gt;(“dataBomParaString”));
tvColunaTerceiro.setCellValueFactory(new PropertyValueFactory&lt;&gt;(“nomeTerceiro”));

observableListCheques = FXCollections.observableArrayList(listaCheques);
tvCheque.setItems(observableListCheques);
 
             return null;       
       }
};
                
Thread thread  = new Thread(task); 
thread.setDaemon(true);
thread.start();