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

标签 java multithreading loops while-loop

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

线程是否暂停 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++;
        }
    }
}

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

最佳答案

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

唯一有点困惑的是 start() 启动另一个线程并为该新线程调用 run()

这是最好不要扩展 Thread 而是将 Runnable 传递给它的原因之一,因为这些方法通常不会执行它们看起来应该执行的操作否则您会出现意想不到的副作用。

注意:Java 通常在堆上有一个代理对象,用于管理实际上在堆外( native )的资源。例如。直接 ByteBuffer 或 JTable 或 Socket 或 FileOutputStream。这些对象并不是操作系统所理解的实际资源,而是 Java 用来简化从 Java 代码管理/操作资源的对象。

关于java - 当你在一个已经工作的线程中调用一个方法时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51710285/

相关文章:

java - MQ消息消失

c++ - 关于 std::async 与 std::launch::async 参数启动的线程的混淆

javascript - 如何使用循环创建表?

c - 多线程程序中的段错误

c++ - 取消 libclang 任务

loops - 编写一个 MIPS 程序来测试一个数是否是 2 的幂

C 条件后增量

java - C# MD5 哈希与 Java MD5 不同

java - 如何读取 CSV 文件的第一列

java - spring-security-samples-form-jc登录如何重定向到inbox.jsp?