As postagens anteriores do blog resumiram basicamente algum conteúdo na concorrência de Java. Esta postagem do blog começa principalmente com um problema e veja quais tecnologias de simultaneidade resumidas acima podem ser usadas para resolvê -las.
Simule um cenário: Processando 16 registros de log, cada tempo de impressão de registro de log leva 1 segundo. Em circunstâncias normais, se esses 16 registros forem concluídos, levará 16 segundos. Para melhorar a eficiência, estamos prontos para iniciar 4 threads para imprimir e imprimi -los em 4 segundos para realizar essa demonstração.
Vamos analisar esta pergunta primeiro. Em relação a esses 16 registros de log, podemos gerá -los no thread principal. Isso não é difícil. A chave é iniciar 4 threads para executar. Existem duas idéias agora: uma é que a geração de logs e o thread que imprime os logs são logicamente separados; O outro é que a geração de logs e o thread que imprimem os logs não são logicamente separados. Isso pode ser um pouco obscuro. Deixe -me escrever uma demonstração implementada com base nessas duas idéias.
A geração de log e a impressão de log são logicamente separados.
Isso é equivalente a duas frentes: uma frente está constantemente gerando troncos e a outra frente está imprimindo constantemente toras. É óbvio que você pensará no uso de filas de bloqueio e gerará toras que continuam se conectando às filas de bloqueio e impressos que continuam recebendo as filas de bloqueio. O tamanho da fila de bloqueio pode ser definido sozinho, 16 ou 1, que não afeta a execução. Portanto, o BlockingQueue será usado, vamos dar uma olhada na demonstração implementada abaixo:
classe pública prática1 {public static void main (string [] args) {// define uma fila de bloqueio, o tamanho da fila pode conter 16 informações de blockingQueue <string> fila = new ArrayBlockingQueue <string> (16); para (int i = 0; i <4; i ++) {// abre quatro fios para blocos run () {while (true) {try {string log = fileue.take (); // obtenha log parselog (log); // imprimir log} catch (interruptedException e) {// tdo automaticamente-genout blocke.printstacktrace ();}}}}). (System.currenttimemillis ()/1000)); para (int i = 0; i <16; i ++) {final string log = "" +(i +1); // indica um log Try {fileue.put (log); // subt o log gerado na fila de bloqueio} captura (intercepedException e) {/ para blocke.printStackTrace ();}}} public static void parselog (string log) {// Método para imprimir o log System.out.println (thread.currentThread (). getName () + "---" + log + "---" + (System.CurrentTimEmillis ()/1000)); Segundo} catch (interruptedException e) {// TODO Gath Blocke.printStackTrace ();}}}}} É como se um sistema estivesse operando, gerando constantemente logs e abrindo continuamente vários threads para imprimir informações de log. A demonstração está escrita e o resultado da operação não é publicado.
A geração de log e a impressão de log não são logicamente separados.
Essa idéia é que, quando eu gero o log, você o imprime e o faz com quatro threads juntos! Então, se você pensa assim, precisa usar o pool de threads. Criei um pool de threads pela primeira vez, que continha 4 threads e, quando o log foi gerado, pedi ao pool de threads que usasse o thread para executá -lo. A demonstração é a seguinte:
classe pública Practice1 {public static void main (string [] args) {ExecutorSerService Service = executores.newfixedThreadpool (4); // Crie um system de threads pool.out.println ("BEGIN:" +(System.CurrentTimElis ()/1000)); para (int i = 0; i <16 i <16; service.execute (novo runnable () {// pegue um thread para executar @Override public void run () {parselog (log);}});} service.shutdown (); // não se esqueça de desativar o pool de threads no final} public static void (string log) {System.out.printnnnnnnnnnnnN (threadn. + "---" + (system.currenttimemillis ()/1000)); tente {thread.sleep (1000); // simular a impressão de um tronco leva 1 segundo} Catch (interruptedException e) {// TODO Auto-Gerated Catch Blocke.printStackTrace ();}}}}}}}}}}}}}}}Vamos resumir este problema aqui. Se você entende essas duas idéias, geralmente as resolvendo de maneira eficaz.
O exposto acima é o conteúdo inteiro deste artigo sobre a programação do Java um código de exemplo de problemas com vários threads, 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!