Explicação detalhada e exemplos de Java Thread Sleep () e Wait ()
dormir
1.Sleep é um método estático de encadeamento. Isso permite que os threads implementados pela Runnable usem o método de sono. Também evita chamar o método Sleep () um para o outro antes que os threads causassem impasses.
2. O sono () precisa ter um tempo de sono ao executar. Durante o sono (durante o tópico de bloqueio), a CPU abandonará este thread e executará outras tarefas. Quando o horário do sono terminar, o thread acordará automaticamente, mas o thread não será executado imediatamente, mas aguarda a CPU para alocar recursos para competir com outros threads.
3. Além disso, se este tópico adquirir uma trava antes, a fechadura não será liberada durante o sono. Outros programas que aguardam esse bloqueio da máquina devem esperar que este tópico acorde e seja executado após a execução.
Código relacionado ao sono
classe pública threadTest2 {public static void main (string [] args) {System.out.println ("Begin Our Test"); Sleep Sleep = new Threadsleep (); tente {thread thread1 = novo thread (sono, "passador A"); Thread Thread2 = novo thread (sono, "passador B"); Thread1.start (); Thread2.start (); } catch (Exceção e) {e.printStackTrace (); } System.out.println ("teste acabou"); }} classe threadsleep implementa runnable {int conting = 0; @Override public void run () {System.out.println (thread.currentThread (). GetName () + "diga: Olá sono !!"); contar(); } public void count () {while (count <20) {System.out.println (thread.currentThread (). getName () + "diga: contagem é" + contagem); tente {count ++; Thread.sleep (100); } catch (Exceção e) {e.printStackTrace (); }}}}Log de saída
BEGIN NOSSO TESTESTEST é o Passerby A diz: Olá sono !! PASSERBY A DIZ: O conde é 0 Passerby B diz: Olá sono !! Passerby B says : count is 1 Passerby A says : count is 2 Passerby B says : count is 2 Passerby A says : count is 4 Passerby B says : count is 4 Passerby A says : count is 6 Passerby B says : count is 7 Passerby B says : count is 8 Passerby A says : count is 8 Passerby A says : count is 10 Passerby B says : count is 10 Passerby B says : count is 12 Passerby A says : count is 12 Passerby B diz: a contagem é 14 Passerby A diz: A contagem é 14 Passerby A diz: A contagem é 16 Passerby B diz: a contagem é 16 PASSERBY A DIGH
Através do log, podemos encontrar que o thread A e o thread B são basicamente executados alternadamente, mas eles são irregulares e têm problemas de simultaneidade.
Essa situação ocorre porque o código define o tempo de sono para 100 milissegundos. Como a velocidade de execução dos incrementos da contagem é muito rápida, a rosca quase dorme ao mesmo tempo e depois acorda ao mesmo tempo e faz com que a concorrência ocorra.
Em seguida, você precisa adicionar um bloco de sincronizar para verificar se o bloqueio do tempo do sono é liberado
classe pública threadTest2 {public static void main (string [] args) {System.out.println ("Begin Our Test"); Sleep Sleep = new Threadsleep (); tente {thread thread1 = novo thread (sono, "passador A"); Thread Thread2 = novo thread (sono, "passador B"); Thread1.start (); Thread2.start (); } catch (Exceção e) {e.printStackTrace (); } System.out.println ("teste acabou"); }} classe threadsleep implementa runnable {int conting = 0; @Override public void run () {System.out.println (thread.currentThread (). GetName () + "diga: Olá sono !!"); contar(); } public void count () {while (count <20) {sincronizado (this) {System.out.println (thread.currentThread (). getName () + "diga: contagem é" + contagem); tente {count ++; Thread.sleep (100); } catch (Exceção e) {e.printStackTrace (); }}}}}}Log de saída
Comece nosso transeunte de teste A diz: Olá sono !! PASSERBY A DIZ: O CONTRO IS 0TEST EXA O PASSERBY B DIZ: Olá sono !! Passerby A says: count is 1 Passerby A says: count is 2 Passerby A says: count is 3 Passerby A says: count is 4 Passerby A says: count is 5 Passerby A says: count is 6 Passerby A says: count is 7 Passerby A says: count is 8 Passerby A says: count is 9 Passerby A says: count is 10 Passerby A says: count is 11 Passerby A says: count is 12 Passerby A says: count is 13 Passor A diz: a contagem é 14 passageiro A diz: a contagem é de 15 passageiros A diz: a contagem é de 16 passageiros A diz: a contagem é de 17 passageiros A diz: a contagem é de 18 passageiros A diz: a contagem é de 19 passantes B diz: a contagem é 20
Pode ser visto a partir do log que basicamente o encadeamento A está executando. Isso ocorre porque durante o sono, a trava da máquina está sempre no segmento A, para que o encadeamento B só possa esperar até que o Thread A libere a trava.
espere
1.wait () é um método da classe de objeto. Quando o método wait () é chamado, o encadeamento entra no pool de espera associado ao objeto e libera a trava que possui.
2. Depois de executar o Wait (), você deve usar o método notify () ou notifyAll () ou definir o tempo de espera (aguarde (longo tempo)) para acordar o thread no pool de threads que espera.
3.wait () deve ser colocado no bloco sincronizado, caso contrário, a exceção "java.lang.illegalmonitorStateException" será relatada em tempo de execução.
Código relacionado à espera
classe pública threadTest2 {public static void main (string [] args) {System.out.println ("Begin Our Test"); Sleep Sleep = new Threadsleep (); tente {thread thread1 = novo thread (sono, "passman a"); Thread Thread2 = novo thread (Sleep, "Passman B"); Thread1.start (); Thread2.start (); } catch (Exceção e) {e.printStackTrace (); } System.out.println ("teste acabou"); }} classe threadsleep implementa runnable {int conting = 0; @Override public void run () {System.out.println (thread.currentThread (). GetName () + "diga: Olá sono !!"); contar(); } public void count () {while (count <20) {sincronizado (this) {System.out.println (thread.currentThread (). getName () + "diga: contagem é" + contagem); tente {count ++; this.wait (100); } catch (Exceção e) {e.printStackTrace (); }}}}}}Log de saída
Comece nosso transeunte de teste A diz: Olá sono !! PASSERBY A DIZ: O CONTRO IS 0TEST EXA O PASSERBY B DIZ: Olá sono !! Passerby B says: count is 1 Passerby A says: count is 2 Passerby B says: count is 3 Passerby A says: count is 4 Passerby B says: count is 5 Passerby A says: count is 6 Passerby B says: count is 7 Passerby A says: count is 8 Passerby B says: count is 9 Passerby A says: count is 10 Passerby B says: count is 11 Passerby A says: count is 12 Passerby B says: count is 13 Passerby B diz: a contagem é 14 Passerby A diz: A contagem é 15 Passerby B diz: A contagem é 16 Passerby A diz: A contagem é 17 Passerby B diz: a contagem é 18 Passerby A diz: a contagem é 19
Através do log, pode -se descobrir que, no caso de espera, a fechadura será liberada.
Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!