私は Java プログラマーであり、スレッドの概念について疑問を持っています。スレッドが2つの条件でどの状態になるかを知りたいだけです。
- スレッドに参加すると、参加したスレッドはどの状態になりますか?
- 待機中のスレッドが通知されると、どの状態になります。実行可能か実行中か?
ありがとう
- 第1問の詳細
メインスレッドが実行されているプログラムでは、「A」、「B」、「C」という名前の3つの新しいスレッドが作成されます。次に、「A」、「B」、「C」の 3 つのスレッドすべてが「メイン」スレッドに参加します。現在、メインスレッドはどの状態にありますか。
- 第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");
}
}