Existem duas maneiras de estabelecer threads em Java, a saber, herdar a classe Thread e implementar a interface executável.
Tópico herdado
public class mythread estende thread {public mythread (nome da string) {super (nome); } int i; public void run () {for (i = 0; i <5; i ++) {System.out.println (getName ()+"-"+i); }} public static void main (string [] AGRS) {new Mythread ("Thread1"). start (); novo mythread ("Thread2"). start (); }} /*Thread 1-0Thread 1-1THREAD 1-2THREAD 1-3THREAD 1-4THREAD 2-0THREAD 2-1THREAD 2-2THREAD 2-3THREAD 2-4* /Como mencionado acima, os objetos do thread em Java devem ser criados na forma de uma classe, e o método run () da classe base deve ser substituído nesta classe. Este método é na verdade o corpo de execução do fio. Chamando o método de início desta instância de classe chama implicitamente o método de execução.
Não é difícil ver que, como o Mythread era novo duas vezes, os exemplos das duas vezes são diferentes, ou seja, cada um tem suas próprias variáveis I, independentes uma da outra.
Interface executável
public class MyRunnable implementa Runnable {int i; public void run () {for (i = 0; i <50; i ++) {System.out.println (thread.currentThread (). getName ()+"-"+i); // this.getName () não pode ser usado diretamente}} public static void main (] [] AGRS) {Myrnnillable}} public myrtic main (] [] (AGRS) {); novo thread (myrun, "thread1"). start (); novo thread (myrun, "thread2"). start (); }} /*Thread 1-0Thread 1-1THREAD 2-0THEAD 2-3THEAD 2-4THEAD 2-5THREAD 2-6THREAD 2-7THREAD 2-8 Thread 2-9th Thread 2-15º Thread 2-110 Thread 2-11º Thread 2-18 Thread 2-11 A-14th Thread 2-21 a 2-110 Thread 2-110 Thread 2-11. 2-22th thread 2-23th thread 2-24th thread 1-17th thread 2--25 threads 1--26 threads 2--27 threads 1--28 threads 1--30 threads 2--29 threads 1--31 threads 2--32 threads 2--34 threads 2--35 threads 2--36 threads 2--37 threads 1--33 threads 2--38 threads 1--39 threads 1--41 threads 2--40 Threads 1--42 Triques 1--44 Triques 1--45 Triques 2--43 Triplos 1--46 Triplos 2--47 Triques 2--49 Triques 1--48*/Pode -se observar que, como esse método é carregar um objeto na classe Thread como um alvo, mesmo que existam muitos objetos de encadeamento em novos, desde que o alvo seja o mesmo objeto de referência, o método de execução do objeto é chamado e todos os threads compartilham os recursos do objeto de destino. Portanto, você verá que o encadeamento 1 e a saída 2 da saída é um total de 51 vezes, e os dois encadeamentos concluíram a saída de I de 0 a 49 e não produzem 5 vezes, respectivamente, como acima. Quanto ao motivo pelo qual 51 são produzidos, os dois threads entram no estado pronto quase ao mesmo tempo (o método de início apenas permite que o encadeamento entre no estado pronto), não é difícil descobrir que, quando eu é igual a 0, o thread 1 e o Thread 2 estão no estado de corrida ao mesmo tempo, resultando em fenômeno de concorrência e na saída de i = 0. Depois disso, a CPU alterna constantemente os threads, de modo que apenas um thread é emitido ao mesmo tempo.
Status do thread
Os tópicos são divididos em 4 estados
Estado pronto: ligue para o método de início e insira o estado pronto.
Estado em execução: o tópico no estado pronto será agendado pela JVM e se tornará o estado de corrida.
Estado de bloqueio: se alguns métodos de sincronização não retornarem os resultados, ocorre um estado de bloqueio, ou sono e Yeild.
Estado da morte: o corpo do método é executado ou um fio é forçado a parar.
Operações básicas de threads
junção () Mesclar thread: Após o thread atual chamar o método de junção de um thread, ele aguardará o thread concluir a execução antes que o thread continue.
Dormir (longos milissegundos) Sleep Sleep: bloqueia o fio atual e continuará apenas quando o tempo de bloqueio acabar. Ao bloquear novamente, a propriedade da CPU será entregue a outros threads; portanto, o sono (1) é frequentemente usado para alternar os threads.
** Concessões de thread de rendimento (): ** Yeild é semelhante ao sono, mas apenas concessões com outros threads em nível superior ou no mesmo nível. Se nenhum outro encadeamento for menor que o seu nível, o thread será executado novamente.
Tópico de fundo
Depois que um programa é executado pelo sistema operacional, haverá um processo e um processo possui pelo menos um thread (encadeamento principal). O encadeamento principal não possui muitos recursos especiais além de outros threads, apenas porque é o encadeamento mais antigo a ser executado, outros threads serão criados no thread principal. Se não for especificado, o encadeamento em primeiro plano (incluindo o thread principal) é criado por padrão. Se o setDaemon (true) for chamado, o thread será explicitamente definido como um thread em segundo plano. O thread de fundo é um thread Daemon. Como você pode ver no nome, sua principal função é fornecer funções de guardião e serviço para outros threads. Quando todos os threads de primeiro plano terminarem, o thread de fundo será forçado a terminar, porque não tem o sentido de existir no momento.
Frea de primeiro plano
classe pública foreandbackthread estende o thread {public foreandbackthread (nome da string) {super (nome); } public void run () {int i; for (i = 0; i <9999; i ++) {System.out.println (this.getName ()+"-"+i); }} public static void main (string [] args) {foreandbackthread th = new foreArndbackthread ("thread a"); //th.setDaemon(True); th.start (); int j; for (j = 0; j <3; j ++) {System.out.println (thread.currentThread (). getName ()+"-"+j); }}}O encadeamento infantil de saída completo do programa é de 0 a 9998; Isso significa que o encadeamento principal não é especial e seu fim não afetará a operação de outros threads de primeiro plano.
Tópico de fundo
classe pública foreandbackthread estende o thread {public foreandbackthread (nome da string) {super (nome); } public void run () {int i; for (i = 0; i <9999; i ++) {System.out.println (this.getName ()+"-"+i); }} public static void main (string [] args) {foreandbackthread th = new foreArndbackthread ("thread a"); th.setDaemon (true); th.start (); int j; for (j = 0; j <3; j ++) {System.out.println (thread.currentThread (). getName ()+"-"+j); }}}O programa não pode produzir 0-9998 na íntegra e sai, indicando que, após o encadeamento principal das extremidades do primeiro plano, a JVM força o thread de fundo a terminar.
Resumir
O exposto acima é sobre a análise de exemplos básicos de tópicos Java neste artigo, espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!