我的java程序阻塞了线程,我需要帮助找出原因

我的java程序阻塞了线程,我需要帮助找出原因,java,multithreading,Java,Multithreading,我自己正在学习如何使用wait()和notify()方法,并尝试制作一个简单的程序,交替输出“jackmale”和“janefemal”50次。 我有一个资源类,它包含我的两个线程将要使用的方法。 这就是它看起来的样子: 公共类共享资源{ 字符串名; 字符串性别; 布尔值isEmpty=true; 同步的公共无效推送(字符串名称、字符串性别){ 试一试{ while(isEmpty==false){ 这个。等等(); } this.name=名称; 睡眠(10); 这个。性别=性别; isEm

我自己正在学习如何使用wait()和notify()方法,并尝试制作一个简单的程序,交替输出“jackmale”和“janefemal”50次。 我有一个资源类,它包含我的两个线程将要使用的方法。 这就是它看起来的样子:

公共类共享资源{
字符串名;
字符串性别;
布尔值isEmpty=true;
同步的公共无效推送(字符串名称、字符串性别){
试一试{
while(isEmpty==false){
这个。等等();
}
this.name=名称;
睡眠(10);
这个。性别=性别;
isEmpty=false;
this.notify();
}捕获(例外e){
e、 printStackTrace();
}
}
同步的公共void pop(){
试一试{
而(我是空的){
这个。等等();
}
睡眠(10);
System.out.println(this.name+“”+this.gender);
isEmpty=true;
this.notify();
}捕获(例外e){
e、 printStackTrace();
}
}

}
您的消费者只调用pop()一次,因此您只能得到一个结果。如果进行线程转储,您应该能够看到生产者正在运行,消费者没有运行

我建议在传递50条消息时,给pop()打50次电话

更好的方法是通过一种特殊的“毒丸”让消费者知道没有更多的数据


您应该能够在不调用
sleep

的情况下编写此文件。我建议您在程序运行时创建一个线程转储(处于卡住状态),并将线程转储编辑到您的问题中。线程转储将指示每个线程到底在等待什么。这些信息对回答您的问题非常有帮助。有关获取线程转储的更多信息,请参阅。