Java方法NotifyAll()不是';不行吗?

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(); }

我有点不知所措。下面几乎是一个复制和粘贴从

据我所知,下面的Java程序应该将
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)”,这将锁定主对象,同时也将阻止主线程。尝试锁定虚拟对象,我会很好地工作。