1. Semáforo
Vamos falar sobre o semáforo primeiro. O Semaphore pode controlar o número de recursos que podem ser acessados simultaneamente, obter uma licença através do adquirir (), aguarde se não houver e a liberação () libere uma licença. Geralmente é usado para controlar o número de encadeamentos simultâneos e a exclusão mútua entre os threads. Além disso, o Reentrantlock também pode implementar essa função, mas a implementação é mais complicada.
A função é semelhante a todos os 5 poços no banheiro. Se 10 pessoas precisam ir ao banheiro, quantas pessoas só podem ir ao banheiro ao mesmo tempo? Ao mesmo tempo, apenas 5 pessoas podem ocupá -lo. Quando qualquer uma das cinco pessoas se afasta, uma das outras 5 pessoas que espera pode ocupar. Além disso, entre as 5 pessoas que esperam, elas podem obter oportunidades prioritárias aleatoriamente, ou podem obter oportunidades para chegar primeiro a chegar.
Um único objeto semáforo pode implementar a função de um mutex e pode ser obtido por um thread e liberado por outro thread. Isso pode ser aplicado em alguns casos de recuperação de impasse.
exemplo:
/** * @Description: * @param @param args * @return void Return Type */public static void main (string [] args) {// thread pool executorService Exec = executores.newcachedThreadpool (); // apenas 5 threads podem acessar o semáforo final = novo semáforo (5); // simular 20 acesso ao cliente para (int index = 0; índice <20; index ++) {final int no = index; Runnable run = new runnable () {public void run () {try {// obtenha permissão semp.acquire (); System.out.println ("Obtenha acesso:" + não); Thread.sleep ((longo) (math.random () * 10000)); // Depois de acessar, libere SEMP.Release (); System.out.println ("REALM VABLEABLEABLE signals----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Resultado da saída (pense por que produz como este):
Obtenha acesso: 1 Obtenha acesso: 5 Obtenha acesso: 2 Obtenha acesso: 3 Obtenha acesso: 0 restante disponível Sinal -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 13 Sinais restantes ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2. Use o tubo como uma ponte entre os fios
O tubo possui um canal de origem e um canal de pia. Os dados serão gravados no canal da pia e lidos no canal de origem. Um dentro e um fora. Vamos primeiro aprender a usá -lo.
Vale a pena notar que, em Java.nio.Channels, esta classe indica que o método de comunicação de dados do método NIO é usado, portanto, use um buffer para buffer dados.
Ilustração do princípio do tubo:
O tubo é um tubo vazio. Uma extremidade deste tubo vazia pode ser lida do interior do tubo e a outra extremidade pode ser gravada no tubo.
Processo de operação:
1. Primeiro, deve haver um objeto para escrevê -lo neste tubo vazio. Onde escrever? Este tubo vazio tem um pouco de espaço, bem neste tubo.
Ao escrever, é escrito no espaço contido no próprio tubo. Esse tamanho de espaço é 1024 bytes.
2. Em seguida, outro objeto pode ler o conteúdo deste tubo preenchido.
No código
pacote com.jx.test; importar java.io.ioException; importar java.nio.bytebuffer; importar java.nio.channels.pipe; public class Testpipe {/** * @Description: * @param @param args * @return type de retorno * thurrows @ThroHexception */stain tubo de tubulação de tubulação = tubo.open (); Final Pipe.SinkChannel Psic = Pipe.Sink (); // Para escrever dados no pipeline, você precisa acessar o canal de pia Final Pipe.SourCechannel psoc = Pipe.source (); {System.out.println ("Send ......"); // Crie um thread e use o tubo de porta de gravação do tubo.SinkChannel Tipo Psic para escrever o conteúdo do bytebuffer especificado no pipeline int res = psic.write (bytebuffer .wrap ("hello,! res);} Catch (Exceção e) {e.printStackTrace ();}}}; thread tpreader = new Thread () {public void run () {int bbuffersize = 1024 * 2; bytebuffer bbuffer = bytebuffer.allocation (bbuffersize); {System.out.PRATIRT.PRERBIRTIRTIRTIRTIRTIRTIRTIRTIRTIRTIVER.TERBUSTIRTIRTIRTIRTIRTIRBER.TERBURTER.NOUTIRTIRTIVER.NOUTIRTIVER.NOUTIRTIVER.NOUTIRTIVER.NOUTIRTIRTIVER. do tubo do pipeline. {E.PrintStackTrace ();}}}; tpwriter.start (); tpreader.start ();}/***bytebuffer-> função de conversão da string*/public static string bytebuffertostring (bytebuffer content) {if (° content.remaining ())) {System.out.println ("não existe ou o conteúdo está vazio!"); retorna null;} int contentsize = content.limit () - content.remaining (); stringBuffer resmatedtr = new StringBuffer (); para (int i = 0; Resultado. ToString ();}}Resumir
O exposto acima é tudo sobre os exemplos de Java Programming Inter-Thread Communication e Semaphore Code 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!