Java 当您在一个已经工作的线程中调用一个方法时会发生什么?

Java 当您在一个已经工作的线程中调用一个方法时会发生什么?,java,multithreading,loops,while-loop,Java,Multithreading,Loops,While Loop,运行下面的测试代码时,似乎在线程方法仍在执行时调用该方法会在当前执行的线程之间运行该方法。 我想知道到底发生了什么 线程是否暂停while循环,执行方法,然后返回循环?它是在while代码的末尾还是在两者之间的任何地方这样做的 或者该方法是否在另一个单独的线程中执行?还是别的什么 package test; public class main { public static threed thred = new threed(); public static void mai

运行下面的测试代码时,似乎在线程方法仍在执行时调用该方法会在当前执行的线程之间运行该方法。 我想知道到底发生了什么

线程是否暂停while循环,执行方法,然后返回循环?它是在while代码的末尾还是在两者之间的任何地方这样做的

或者该方法是否在另一个单独的线程中执行?还是别的什么

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++;
        }
    }
}

封装测试;
公共类3D扩展线程{
公共int x;
公共3D(){
x=0;
}
公开募捐{
而(x<10){
系统输出println(x);
}   
}
公共及其他{
系统输出打印项次(“其他”+x);
}
}

所有调用的方法都对所有对象使用当前线程。如果在
线程上调用方法,它也会像在当前线程上调用任何其他方法一样调用该方法

唯一稍微让人困惑的是
start()
启动另一个线程并为该新线程调用
run()

这就是为什么最好不要扩展
线程
,而是将
可运行
传递给它的原因之一,因为太多的时候,这些方法要么做不到它们看起来做的事情,要么会产生意想不到的副作用


注意:Java通常在堆上有一个代理对象,用于管理实际上是堆外(本机)的资源。例如,direct ByteBuffer或JTable或Socket或FileOutputStream。这些对象不是操作系统所理解的实际资源,而是Java用来使Java代码中的资源更易于管理/操作的对象。

发生了什么:主线程执行所有这些操作:

thred.start(); // start another thread
Thread.sleep(10000); // sleep
while (true) {
   System.out.println("doing it"); 
   thred.other(); // invoke a method on some object
意思是:other线程运行其
run()
方法,nothingother


在代码中,main线程只需调用该线程对象上的另一个方法。它仍在主线程上发生

它不是调用“线程的方法”,而是调用对象的方法。它在主线程中调用它们,而线程的
run()
方法在另一个线程中运行。除了它们知道如何在JVM中启动新线程外,
thread
对象没有任何特殊之处。只要您手中有对象,就可以调用方法。神奇的事情发生在JVM调度程序中。该方法将由两个线程独立执行(如果有足够的CPU/内核存在/可用,则最终并行执行),作为旁注,永远不要公开公共可变对象变量。接下来可能会读到关于
volatile
synchronized
的文章,你在跟踪我吗?!这是过去几天里你第三次以几秒钟的优势击败我得到同样的答案:-)(当然是+1。)@MichaelBerry我经常点击refresh查看最新的问题,我想这意味着我可能会更快地看到问题。我应该回答已经持续几分钟的问题……;)在我看来,很多新手不理解线程和
线程
对象之间的区别。这可能有助于解释
start()
是创建实际线程的
Thread
方法,其他
Thread
方法用于管理该线程。@jameslarge我在末尾添加了一个注释。好建议。
thred.start(); // start another thread
Thread.sleep(10000); // sleep
while (true) {
   System.out.println("doing it"); 
   thred.other(); // invoke a method on some object