4

私は Java プログラマーであり、スレッドの概念について疑問を持っています。スレッドが2つの条件でどの状態になるかを知りたいだけです。

  1. スレッドに参加すると、参加したスレッドはどの状態になりますか?
  2. 待機中のスレッドが通知されると、どの状態になります。実行可能か実行中か?

ありがとう

  1. 第1問の詳細

メインスレッドが実行されているプログラムでは、「A」、「B」、「C」という名前の3つの新しいスレッドが作成されます。次に、「A」、「B」、「C」の 3 つのスレッドすべてが「メイン」スレッドに参加します。現在、メインスレッドはどの状態にありますか。

  1. 第2問の詳細

待機&通知のサンプルコードです。2 つのスレッド "A" と "B" が "hello" オブジェクトの使用を開始するとします。最初の B スレッドが実行され、「待機」状態になります。次に、「A」スレッドが実行され、「B」スレッドに通知されます。ここで、「待機中」のスレッド B はどの状態に入りますか。オブジェクトのロックが解除されたので、直接 Running 状態になりますか、それとも Runnable に移行してから Running 状態に移行しますか? メインスレッドの他にもう 1 つのスレッドが存在することに注意してください。

public class Hello {
     int x;
     boolean flag=false;
     synchronized public void push(int x)
     {
         if(flag)
         {
             try
             {
                 wait();
             }
             catch(Exception e)
             {
                 System.out.println(e);
             }
         }
         this.x=x;
         System.out.println(x +"is pushed");
         flag=true;
         notify();
     }

    synchronized public void pop()
     {
        if(!flag)
         {
            try
             {
                wait();
             }
             catch(Exception e)
             {
                 System.out.println(e);
             }
         }
         System.out.println(x +"is poped");
         flag=false;
         notify();

     }

}

class A implements Runnable
{
     Hello h=null;
     A(Hello h,String name)
     {
         this.h=h;
         Thread t1=new Thread(this,name);
         t1.start();
     }
     public void run()
     {
         int a=1;
         for(int i=0;i<7;i++)
         {
             h.push(a++);
         }
     }
}

class B implements Runnable
{
     Hello h=null;
     B(Hello h,String name)
     {
         this.h=h;
         Thread t2=new Thread(this,name);
         t2.start();
     }
     public void run()
     {
        for(int i=0;i<7;i++)
         {
            h.pop();
         }
     }
};

public class WaitAndNotifyDemo {
    public static void main(String[] args) {
        Hello h = new Hello();
         A obj1=new A(h,"A");
         B obj2=new B(h,"B");


    }

}
4

1 に答える 1