No exemplo acima, o método join da classe Thread é usado muitas vezes. Acho que você deve ter adivinhado qual é a função do método join. Sim, a função do método join é transformar o thread de execução assíncrona em uma execução síncrona. Ou seja, quando o método start da instância do thread for chamado, este método retornará imediatamente. Se você precisar usar um valor calculado por este thread após chamar o método start, você deve usar o método join. Se você não usar o método join, não há garantia de que quando uma instrução após o método start for executada, o thread será executado. Depois de usar o método join, o programa não continuará a execução até que o thread termine. O código a seguir demonstra o uso de join.
Copie o código do código da seguinte forma:
pacote mitoread;
classe pública JoinThread estende Thread
{
público estático int n = 0;
estático sincronizado void inc()
{
n++;
}
execução de vazio público ()
{
para (int i = 0; i < 10; i++)
tentar
{
inc();
sleep(3); // Para tornar os resultados da execução mais aleatórios, atrase 3 milissegundos
}
pegar (Exceção e)
{
}
}
public static void main(String[] args) lança exceção
{
Tópico tópicos[] = new Tópico[100];
for (int i = 0; i < threads.length; i++) // Cria 100 threads
threads[i] = new JoinThread();
for (int i = 0; i < threads.length; i++) // Executa os 100 threads recém-criados
tópicos[i].start();
if (args. comprimento > 0)
for (int i = 0; i < threads.length; i++) // Continua após todos os 100 threads terem sido executados
threads[i].join();
System.out.println("n=" + JoinThread.n);
}
}
Na rotina 2 a 8, 100 threads são criados e cada thread aumenta a variável estática n em 10. Se n for gerado após todos os 100 threads serem executados, o valor n deverá ser 1000.
1. Teste 1
Use o seguinte comando para executar o programa acima:
Copie o código do código da seguinte forma:
java mitoread.JoinThread
Os resultados da execução do programa são os seguintes:
Copie o código do código da seguinte forma:
n=442
Este resultado de execução pode ter algumas diferenças em diferentes ambientes de execução, mas geralmente n não será igual a 1000. A partir dos resultados acima, podemos ter certeza de que n será gerado antes que todos os 100 threads sejam executados.
2. Teste 2
Execute o código acima usando o seguinte comando:
Existe um parâmetro join na linha de comando acima. Na verdade, qualquer parâmetro pode ser usado na linha de comando, desde que haja um parâmetro join é usado aqui apenas para indicar que o método join é usado para sincronizar a execução de. esses 100 tópicos.
Os resultados da execução do programa são os seguintes:
Copie o código do código da seguinte forma:
n=1000
Não importa em qual ambiente operacional você execute o comando acima, você obterá o mesmo resultado: n=1000. Isso demonstra totalmente que todos os 100 threads devem ter sido executados, portanto, n deve ser igual a 1000.