Suponha que haja dois threads em execução simultaneamente, e o código executado por um thread contém um loop morto como: while (true) ... Quando o thread executa o código em while (true), o outro thread terá uma chance de executar?
Código de exemplo (o código se origina da Internet)
public class Service {object Object1 = new Object (); public void Metoda () {Synchronized (object1) {System.out.println ("Methoda BEGIN"); booleano iscontinuerun = true; // executa um loop morto aqui enquanto (iscontinuerun) {} System.out.println ("Methoda end"); }} Objeto objeto2 = new Object (); public void methodB () {Synchronized (object2) {System.out.println ("MethodB BEGN"); System.out.println ("MethodB end"); }}} A implementação das duas classes de threads é a seguinte:
importar serviços.service; public class Threada estende thread {Serviço privado; public threada (serviço de serviço) {super (); this.Service = Service; } @Override public void run () {service.methoda (); }} Thread A Executa Methoda (), e há um loop morto em Methoda ()
importar serviço.service; classe pública ThreadB estende thread {Serviço privado; public ThreadB (serviço de serviço) {super (); this.Service = Service; } @Override public void run () {service.methodb (); }}O thread B executa o métodob (). Quando o thread A entra no loop while morto em Methoda (), o Thread B pode executar e concluir?
Classe de teste
importar serviços.service; importar extthread.Threada; importar extthread.threadb; public class Run {public static void main (string [] args) {Service Service = new Service (); Threada athread = new threada (serviço); athread.start (); Threadb bthread = new ThreadB (serviço); bthread.start (); }}Como o bloqueio do objeto obtido por encadeamento A e Thread B não é o mesmo bloqueio, ele pode ser visto no resultado de que o encadeamento B pode ser executado e concluído. Desde que o thread A entra no loop morto, o Thread A continua a executar e executar (o programa inteiro não terminou), mas o thread B terminará.
Ou seja, embora o Thread A esteja sempre executando por enquanto, ele precisa assumir a CPU. No entanto, a programação de threads é de responsabilidade da JVM ou do sistema operacional. Isso não significa que o encadeamento A esteja constantemente loop enquanto e, em seguida, o thread B não ocupará a CPU. Para o tópico A, é equivalente a um trabalho "intensivo em computação". Se o nosso loop, enquanto o loop te testar continuamente se uma certa condição é verdadeira, esse método é um desperdício de CPU. Você pode se referir a um exemplo específico: "Método de comunicação entre thread" no método de comunicação entre os threads do ponto Java Java Java do "método de comunicação entre thread" durante a pesquisa.
Se o serviço.java for modificado da seguinte forma:
public class Service {// Object Object1 = new Object (); public void Methoda () {Synchronized (this) {System.out.println ("Methoda Begin"); booleano iscontinuerun = true; // executa um loop morto aqui enquanto (iscontinuerun) {} System.out.println ("Methoda end"); }} // objeto object2 = new Object (); public void methodB () {Synchronized (this) {System.out.println ("Methodb BEGN"); System.out.println ("MethodB end"); }}}Se o thread A obtiver o bloqueio do objeto primeiro, o encadeamento A estará sempre no while loop devido ao loop while. O Thread B não pode executar o MethodB () porque não pode obter o bloqueio.
Pode -se observar que, se um thread não puder sair no método sincronizado e não puder liberar o bloqueio, o outro thread só pode esperar infinitamente.
O acima é tudo sobre este artigo. Espero que seja útil para todos aprenderem o Java Multithreading.