1

メインから Producer を作成するとします。次に、このプロデューサーは独自のスレッドを作成し、何かを生成すると function を呼び出しますmain.addProduct()。この関数は、それを呼び出したプロデューサーと同じスレッドで実行されますか? それとも、メインと同じスレッドで動作しますか?つまり、解決する前に他のすべてのタスクが完了するまで待機しますか?

説明する

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 に答える