Como usar Thread

Estou desenvolvendo uma aplicação para rodar audio/video. O problema esta na reprodução sequencial. Estou usando o VLCJ. Pensei em usar uma Thread que vai dormir durante o tempo do vídeo, quando terminar lê novamente o banco e volta a reproduzir. Porem, não sei como fazer para a tela principal efetuar uma ação quando a Thread terminar.

Você pode utilizar uma CountDownLatch com tamanho 1. A thread principal vai criar a latch, inicializar a thread de reprodução e em seguida dar um .await() na latch. Quando a thread de reprodução acabar, ela pode dar um .countDown() na latch, liberando assim a thread principal.

O problema dessa abordagem é que se a thread principal for a thread do framework de UI que você estiver utilizando, a UI vai ficar travada porque a thread vai estar dormindo esperando a latch ser liberada.

Dá pra fazer algo similar utilizando Semaphore ou alguma outra primitiva de concorrência. Você precisa entender como elas funcionam para decidir qual o melhor para o seu caso. Ou então descreva melhor o problema.

IvBarbosa,
De fato, não posso parar a UI principal. Vou explicar melhor.
Estou desenvolvendo um player de audio/video, onde o usuário vai selecionando as musicas que vão entrando em uma playlist. No final da reprodução do primeiro video, a aplicação recarrega a play list através do banco de dados e assim sucessivamente até o final da lista. Na API do VLCj tem um método fineshed que pode ser implementado. Só que trava quando faço o reload do método. Pensei em usar a Thread com o sleep igual ao tempo do video, só que ela precisa sinalizar a UI principal que terminou a execução. Ou tem outra alternativa para o meu problema?

Então você só precisa da thread principal e da thread de reprodução. Quando o usuário inserir algo na playlist, você atualiza a playlist em memória e no banco. A thread de reprodução vai apenas reproduzir sequencialmente o que se encontra em memória.

Se existe a possibilidade da playlist no banco ser alterada por outro motivo fora o do próprio usuário mexendo no programa, você pode definir que quando estiver faltando 1 (ou N) item para a playlist acabar, uma nova thread é criada para buscar a playlist no banco e atualizar a memória.

Outra coisa que você pode fazer é transformar a thread de reprodução num consumidor. Ela vai ter acesso a uma BlockingQueue. Toda vez que acabar a reprodução, ela pega o próximo elemento da fila e o reproduz. Quando o usuário adicionar um item na playlist, você só joga o item dentro da fila, e ele eventualmente será processado.

Tem várias maneiras de resolver seu problema. Contudo, você precisa entender as primitivas de concorrência para poder saber o que utilizar. Vai ser difícil conseguir explicar tudo aqui.

Consegui resolver, obrigado pela dica. Fiz da seguinte forma: O VLCj tem a função repeat, aí quando tem linha na tabela(playlist) ele muda o nome do arquivo que deve ser reproduzido e muda esse parâmetro para true.