gpt4 book ai didi

java - 多线程中的通知

转载 作者:搜寻专家 更新时间:2023-11-01 03:06:44 25 4
gpt4 key购买 nike

我是一名 Java 程序员,我对线程有概念上的疑问。我只想知道一个线程在2种情况下会进入哪个状态。

  1. 当你加入一个线程时,加入的线程会进入什么状态?
  2. 当一个等待线程被通知时,它会进入哪个状态。可运行还是正在运行?

谢谢

  1. 第一个问题的详细信息

在程序主线程运行时,它创建了 3 个名为“A”、“B”和“C”的新线程。然后所有 3 个线程“A”、“B”和“C”线程加入“主”线程。现在主线程处于什么状态。

  1. 第二个问题的详细信息

这是等待和通知的示例代码。如果假设 2 个线程“A”和“B”开始使用“hello”对象。第一个 B 线程执行并进入“等待”状态。然后“A”线程执行并通知“B”线程。现在“等待”的线程B将进入哪个状态。是因为释放对象锁直接进入Running状态还是先进入Runnable再进入Running状态?请注意还有一个主线程也存在

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");


}

}

最佳答案

  1. 已加入的线程甚至不会注意到您正在加入它。 加入线程将进入等待状态。
  2. 被通知的线程最初将进入阻塞状态,因为它将被添加到它之前执行过Object#wait 的监视器的等待集中。根据定义,Object#wait 只能针对您当前拥有锁的对象执行,您必须重新获取该锁才能从 wait 中恢复。

请注意,RunnableRunning 之间的区别在于线程调度程序的细节。 Thread.State 枚举不区分这些。

关于java - 多线程中的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19832176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com