1

假设我从我的主创建生产者。然后,这个生产者创建它自己的线程,当它产生东西时调用一个函数main.addProduct()。这个函数会和调用它的生产者在同一个线程中执行吗?或者它会在与 main 相同的线程中工作,这意味着它会等到所有其他任务完成后再解决它?

为了显示

public class MainP{
  public static void main(String[] args) {
        Producer p1 = new producer;
        Producer p2 = new producer;
        Producer p3 = new producer;
        p1.start();
        p2.start();
        p3.start();
        System.out.println("I'm ugly");
  }

  public static void prettyFunction(){
        System.out.println("I'm pretty!");
  }

}

public class Producer  extends Thread{
  public void run(){
        while(true)
              MainP.prettyFunction();
}

问题是结果是否会是

  I'm ugly
  I'm pretty!
  I'm pretty!
  I'm pretty!
  ...

或者

  I'm pretty!
  I'm pretty!
  I'm pretty!
  I'm ugly
  I'm pretty!
  I'm pretty!
  I'm pretty!
  ...
4

2 回答 2

3

线程不关心它们在哪些对象中运行。除非它们与另一个线程连接(即它们被停止),或者如果它们遇到生成新线程的代码,则所有内容都保留在线程中。

显然,如果您从多个线程调用一个方法,尤其是具有副作用的方法,例如main.addProduct(),您需要考虑同步。

于 2013-10-27T15:52:31.463 回答
1

如果main.addProduct()从您的生产者线程调用,那么它是执行该方法的线程,而不是您的主线程。它不会等到您的主线程中的其他任务完成后,因此这里可能会出现同步错误。

于 2013-10-27T15:53:37.853 回答