Executando o meu código de teste abaixo parece que chamar um método tópicos enquanto ele ainda está em execução executa o método entre as threads de execução atual. O que eu estou querendo saber é o que é exatamente a acontecer?
Será que o fio pausar o while loop, executar o método, e depois voltar para o loop? Será que fazê-lo no final do código, enquanto ou em qualquer lugar?
Ou será que o método de execução em outro segmento separado? Ou algo completamente diferente?
package test;
public class main {
public static threed thred = new threed();
public static void main(String[] args) throws InterruptedException {
thred.start();
Thread.sleep(10000);
while (true) {
System.out.println("doing it");
thred.other();
Thread.sleep(2000);
thred.x++;
}
}
}
e
package test;
public class threed extends Thread {
public int x;
public threed() {
x = 0;
}
public void run() {
while (x < 10) {
System.out.println(x);
}
}
public void other() {
System.out.println("other " + x);
}
}
Todos os métodos chamados estiver usando o segmento atual para todos os objetos. Se você chamar um método em Thread
que também chama esse método como qualquer outro no segmento atual.
O único que é ligeiramente confusão é que start()
começa outro segmento e chamadas run()
para esse novo segmento.
Esta é uma das razões é melhor não estender Thread
, mas passar uma Runnable
a ele como também muitas vezes os métodos ou não fazer o que parecem ou tiver efeitos secundários que você não espera.
NOTA: Java, muitas vezes tem um objeto de proxy na pilha para o gerenciamento de um dos recursos que na verdade é off pilha (nativo). Por exemplo, dirigir ByteBuffer ou JTable ou soquete ou FileOutputStream. Esses objetos não são o recurso real como o sistema operacional entende-los, mas um objeto Java usa para torná-lo mais fácil de gerenciar / manipular o recurso a partir do código Java.