Java方法NotifyAll()不是';不行吗?
我有点不知所措。下面几乎是一个复制和粘贴从 据我所知,下面的Java程序应该将Java方法NotifyAll()不是';不行吗?,java,eclipse,multithreading,wait,Java,Eclipse,Multithreading,Wait,我有点不知所措。下面几乎是一个复制和粘贴从 据我所知,下面的Java程序应该将yumyum..打印到屏幕上,但它不是。我在MacOSX的Eclipse中。你知道我做错了什么吗 public class Main { public static void main(String[] args) { MyHouse house = new MyHouse(); house.eatPizza(); house.pizzaGuy(); }
yumyum..
打印到屏幕上,但它不是。我在MacOSX的Eclipse中。你知道我做错了什么吗
public class Main {
public static void main(String[] args) {
MyHouse house = new MyHouse();
house.eatPizza();
house.pizzaGuy();
}
}
class MyHouse extends Thread {
private boolean pizzaArrived = false;
public void eatPizza() {
synchronized (this) {
while (!pizzaArrived) {
try {
wait();
} catch (InterruptedException e) {
}
}
}
System.out.println("yumyum..");
}
public void pizzaGuy() {
synchronized (this) {
this.pizzaArrived = true;
notifyAll();
}
}
}
你有一根线。单个线程将无限期地等待(需要另一个线程通知)。尝试创建另一个线程,其中一个将
eatppizza()
,另一个将pizzagoy
您有一个线程。单个线程将无限期地等待(需要另一个线程通知)。尝试创建另一个线程,其中一个线程将eatpazia()
并且一个线程将pizzagy
尝试此操作
public class Main {
public static void main(String[] args) {
MyHouse house = new MyHouse();
house.start();
// house.eatPizza();
// Halt main thread momentarily to delay Mr Pizza Guy
try { Thread.sleep(3000); } catch(Exception e) {}
house.pizzaGuy();
}
}
class MyHouse extends Thread {
private boolean pizzaArrived = false;
private Object lock = new Object();
@Override
public void run() {
eatPizza();
}
public void eatPizza() {
synchronized (lock) {
while (!pizzaArrived) {
try {
System.out.println("Waiting for Pizza guy");
lock.wait();
} catch (InterruptedException e) {
}
}
System.out.println("Pizza arrived!!!");
}
System.out.println("yumyum..");
}
public void pizzaGuy() {
synchronized (lock) {
this.pizzaArrived = true;
lock.notifyAll();
}
}
}
试试这个
public class Main {
public static void main(String[] args) {
MyHouse house = new MyHouse();
house.start();
// house.eatPizza();
// Halt main thread momentarily to delay Mr Pizza Guy
try { Thread.sleep(3000); } catch(Exception e) {}
house.pizzaGuy();
}
}
class MyHouse extends Thread {
private boolean pizzaArrived = false;
private Object lock = new Object();
@Override
public void run() {
eatPizza();
}
public void eatPizza() {
synchronized (lock) {
while (!pizzaArrived) {
try {
System.out.println("Waiting for Pizza guy");
lock.wait();
} catch (InterruptedException e) {
}
}
System.out.println("Pizza arrived!!!");
}
System.out.println("yumyum..");
}
public void pizzaGuy() {
synchronized (lock) {
this.pizzaArrived = true;
lock.notifyAll();
}
}
}
尝试下面的代码工作正常。 公共类等待通知{
private static int i = 1;
private static boolean flag = false;
static Object obj = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable(){
@Override
public void run() {
while(i<10){
synchronized (obj) {
try {
if(i%2 == 0){
obj.wait();
}
System.out.println("t1 -> " + i++);
obj.notify();
Thread.currentThread().sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
});
Thread t2 = new Thread(new Runnable(){
@Override
public void run() {
while(i<10){
synchronized (obj) {
try {
if(i%2 != 0){
obj.wait();
}
System.out.println("t2 -> " + i++);
obj.notify();
Thread.currentThread().sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static int i=1;
私有静态布尔标志=false;
静态对象obj=新对象();
公共静态void main(字符串[]args){
线程t1=新线程(新的可运行线程(){
@凌驾
公开募捐{
虽然(i尝试下面的代码工作正常。
公共类等待通知{
private static int i = 1;
private static boolean flag = false;
static Object obj = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable(){
@Override
public void run() {
while(i<10){
synchronized (obj) {
try {
if(i%2 == 0){
obj.wait();
}
System.out.println("t1 -> " + i++);
obj.notify();
Thread.currentThread().sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
});
Thread t2 = new Thread(new Runnable(){
@Override
public void run() {
while(i<10){
synchronized (obj) {
try {
if(i%2 != 0){
obj.wait();
}
System.out.println("t2 -> " + i++);
obj.notify();
Thread.currentThread().sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static int i=1;
私有静态布尔标志=false;
静态对象obj=新对象();
公共静态void main(字符串[]args){
线程t1=新线程(新的可运行线程(){
@凌驾
公开募捐{
while(iAlas,仍然不工作。这是我更新的main:public类main{public synchronized static void main(String[]args){MyHouse house=new MyHouse();house.eatpisa();MyHouse house house1=new MyHouse();house1.pizzagguy();}@MartynChamberlin更糟糕。现在你仍然只有一个线程,并且调用两个不同对象的同步方法。要拥有一个线程,你需要调用start()
在某个线程实例上。否则,所有操作都由主线程执行。@JBNizet您介意在我的主方法中发布一个示例,说明这是什么样子吗?我正在调用.start()(忘了这一点,谢谢)它仍然不工作。为我的厚脑袋感到抱歉。匿名者刚刚做了。唉,仍然不工作。这是我更新的main:public class main{public synchronized static void main(String[]args){MyHouse house house=new MyHouse();house.eatpisa();MyHouse house1=new MyHouse();house1.pizzagoy();}@MartynChamberlin更糟糕。现在你仍然只有一个线程,并且调用两个不同对象的同步方法。要拥有一个线程,你需要调用start()
在某个线程实例上。否则,所有操作都由主线程执行。@JBNizet您介意在我的主方法中发布一个示例,说明这是什么样子吗?我正在调用.start()(忘了这一点,谢谢)但它仍然不起作用。对不起,我的脑袋太厚了。anonymous刚刚这么做了。这是完美的匿名。谢谢!正确,不要使用“synchronized(This)”,这会锁定主对象,也会阻止主线程。尝试锁定虚拟对象,我会工作得很好。这是完美的匿名。谢谢!正确,不要使用“synchronized(This)”,这将锁定主对象,同时也将阻止主线程。尝试锁定虚拟对象,我会很好地工作。