Junte -se literalmente significa ingressar. Vamos dar uma olhada na explicação e implementação do método de junção.
/*** espera que este tópico morra. * O encadeamento do chamador (o thread que chama o método de junção) executa uma operação em espera até que o encadeamento chamado (o encadeamento ao qual o método de junção pertence) termine e é acordado novamente * <p> Uma invocação desse método se comporta exatamente da mesma maneira que o encadeamento da chamada * * * @ThrowSceptException * se houver algum thread interrompido. O status * <i> interrompido </i> do thread atual é * limpo quando essa exceção é lançada. */ public final void junção () lança interruptedException {junção (0); }Aqui a participação é chamada
/** * aguarda no máximo {@code millis} milhões de segundos para este thread para * morrer. Um tempo limite de {@code 0} significa aguardar a execução do thread terminar, ou o tempo máximo de espera especificado chegou, o tópico do chamador será despertado novamente. Se o tempo máximo de espera for 0, você só poderá aguardar a execução do thread terminar antes de poder acordar. * <p> Esta implementação usa um loop de {@code this.wait} chamadas * condicionadas em {@code this.isalive}. Como um thread termina o método * {@code this.notifyall} é chamado. Recomenda -se que * aplicativos não usem {@code wait}, {@code notify} ou * {@code notifyAll} em instâncias {@code thread}. * * */ public final sincronizado void junção (long millis) lança interruptedException {long base = System.currenttimEmillis (); longo agora = 0; if (millis <0) {lança novo ilegalargumentException ("o valor do tempo limite é negativo"); } if (millis == 0) {while (isalive ()) {wait (0); }} else {while (isalive ()) {long hellay = millis - agora; if (atraso <= 0) {break; } espera (atraso); agora = system.currenttimemillis () - base; }}} Pode -se observar que o próprio método de junção implementa aguardando o método de espera. É julgado aqui que, se o tópico ainda estiver em execução, continue esperando. Se o tempo especificado chegou ou o thread concluiu em execução, o código continua a executar para baixo e o thread de chamada pode executar a lógica subsequente.
Mas aqui não vejo onde chamar o método Notify ou NotifyAll. Se não for chamado, o encadeamento do chamador continuará esperando. Onde o método para acordar? Através da verificação, verificou -se que, quando o thread terminou, a máquina virtual Java executou o método de saída local do thread.
// Função de saída de thread: void javathread :: exit (bool destruir_vm, exittype exit_type) {... // Isso lidará com a lógica de destruição relacionada à junção, garantir_Join (this); ...} // PROCESSAR o threadj threadj; ObjectLocker Lock (Threadobj, Thread); thread-> clear_pending_exception (); java_lang_thread :: set_thread_status (threadobj (), java_lang_thread :: encerrado); java_lang_thread :: set_thread (threadobj (), null); // Aqui chamamos o método notifyAll para acordar o bloqueio do thread de espera.Notify_all (Thread); thread-> clear_pending_exception (); }Isso entenderá quando o tópico for despertado. Vamos escrever um exemplo abaixo para ver o efeito.
public class Jointest {public static void main (string [] args) {threadboy boy = new Threadboy (); menino.start (); } classe estática threadboy estende thread {@Override public void run () {System.out.println ("Boy e menina estão prontos para ir às compras"); Threadgirl Girl = new Threadgirl (); Girl.start (); tente {girl.join (); } catch (interruptedException e) {e.printStackTrace (); } System.out.println ("O garoto e a garota começam a fazer compras"); }} classe estática threadgirl estende thread {@Override public void run () {int time = 5000; System.out.println ("A garota começa a vestir maquiagem, o garoto está esperando ..."); tente {thread.sleep (tempo); } catch (interruptedException e) {e.printStackTrace (); } System.out.println ("A garota terminou com maquiagem!, Tempo necessário" + tempo); }}}} O resultado da execução é:
O garoto e a menina estão saindo comprando e a garota começa a vestir maquiagem, o garoto está esperando. . .
A maquiagem da garota acabou! 5000
O menino e a menina começaram a fazer compras
O menino e a menina vão fazer compras. A garota precisa colocar maquiagem primeiro. Depois que a garota terminar de maquiagem, ela irá fazer compras juntos.
Então, qual é o uso de junção (tempo)?
public class Jointest {public static void main (string [] args) {threadboy boy = new Threadboy (); menino.start (); } classe estática threadboy estende thread {@Override public void run () {System.out.println ("Boy e menina estão prontos para ir às compras"); Threadgirl Girl = new Threadgirl (); Girl.start (); int time = 2000; tente {girl.join (tempo); } catch (interruptedException e) {e.printStackTrace (); } System.out.println ("O garoto esperou" + time + ", não quero mais esperar, vou fazer compras"); }} classe estática threadgirl estende thread {@Override public void run () {int time = 5000; System.out.println ("A garota começou a vestir maquiagem, o garoto estava esperando ..."); tente {thread.sleep (tempo); } catch (interruptedException e) {e.printStackTrace (); } System.out.println ("A garota terminou de compensar!, Tempo gasto" + tempo); }}} Aqui, o método de junção é substituído apenas pelo método de junção (horário). A descrição foi alterada e o resultado da impressão é:
O garoto e a menina estão saindo comprando e a garota começa a vestir maquiagem, o garoto está esperando. . .
O garoto esperou 2.000 e não queria mais esperar. Ele foi às compras e a garota terminou de vestir maquiagem! 5000
O garoto esperou o tempo ingressado (tempo). Se o tópico em que a menina estava não foi executada após a chegada desse período, ele não esperará mais e continuará a executar a lógica subsequente, apenas para fazer compras sozinha sem esperar a garota.
A partir disso, podemos ver que o método de junção é obter a execução síncrona de dois threads de maneira mais conveniente. O thread 1 é executado. Depois de encontrar o Thread 2, aguarde a execução do Thread 2 e continue executando a execução do Thread 1. O significado de unir agora é mais visual.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.