【问题标题】:If i call a function of my main class in java, from other object which has its own thread, will this function run in separate thread?如果我在java中调用我的主类的一个函数,从其他有自己线程的对象,这个函数会在单独的线程中运行吗?
【发布时间】:2013-10-27 15:46:17
【问题描述】:

假设我从我的主创建 Producer。然后,这个生产者创建它自己的线程,当它产生一些东西时调用一个函数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!
  ...

【问题讨论】:

  • 你能不能发一些示例代码,这样就很容易说哪个代码在哪个线程下运行了。
  • 不清楚你在问什么。
  • @srsyogesh 我发布了一些示例代码
  • 因为这里没有同步,所以你猜不到输出。每次运行此程序时,您都可能会看到不同的结果。显然 prettyFunction 不会在主线程下运行,而是在调用该函数的新线程下运行。

标签: java multithreading parallel-processing


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多