【问题标题】:What happens when you call a method in a thread that is already working?当您在已经工作的线程中调用方法时会发生什么?
【发布时间】:2019-01-13 13:41:01
【问题描述】:

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

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

【问题讨论】:

  • 不是调用“线程的方法”,而是调用对象的方法。它在主线程中调用它们,而线程的run() 方法在另一个线程中运行。
  • Thread 对象没有什么特别之处,只是它们知道如何在 JVM 中启动一个新线程。只要您手中有一个对象,就可以调用方法。魔术发生在 JVM 调度程序中。
  • 该方法将由两个线程独立执行(如果存在/可用足够多的 CPU/内核,最终并行执行)
  • 附带说明,切勿公开公共可变对象变量。接下来也许阅读volatile和synchronized

标签: java multithreading loops while-loop


【解决方案1】:

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

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

这是最好不要扩展 Thread 而是将 Runnable 传递给它的原因之一,因为这些方法要么不按照它们看起来的那样做,要么你会得到意想不到的副作用.

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

【讨论】:

  • 你在跟踪我吗?!这是过去几天里你第三次在相同的答案上领先我几秒钟:-)(当然是+1。)
  • @MichaelBerry 我经常点击刷新以查看最新问题,我认为这意味着我可能会更快看到问题。我应该回答已经讨论了几分钟的问题... ;)
  • IMO,很多新手不明白 thread 和 Thread 对象之间的区别。这可能有助于解释 start() 是 创建 实际线程的 Thread 方法,而其他 Thread 方法用于管理该线程。
  • @jameslarge 我在最后添加了一条注释。好建议。
【解决方案2】:

发生了什么:ma​​in 线程完成了所有这些工作:

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()方法,nothing else。

在您的代码中,您的 ma​​in 线程只是调用该线程对象上的另一个方法。它仍在 主 线程上发生!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-24
    • 2019-10-22
    • 2019-02-12
    • 2016-11-29
    • 2010-12-07
    • 2013-10-13
    • 1970-01-01
    • 2022-09-26
    相关资源
    最近更新 更多