如果我在java中调用我的主类的函数,从具有自己的线程的其他对象,这个函数将在单独的线程中运行?

时间:2013-10-27 15:46:18

标签: java multithreading parallel-processing

让我说我从我的主要创建制作人。然后,这个生成器创建它自己的线程,当它产生一些东西时调用一个函数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!
  ...

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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