notify()とnotifyAll()の違い

2091 ワード

       ,             ,     ,                       ,  notify
import java.util.ArrayList;
import java.util.List;

class Widget{}
class WidgetMaker extends Thread{
    List finishedWidgets = new ArrayList();
    public void run(){
         try{
             while(true){
                 Thread.sleep(5000);
                 Widget w = new Widget();
                 Widget i = new Widget();
                 Widget d = new Widget();
                 synchronized (finishedWidgets) {
                    finishedWidgets.add(w);
                    finishedWidgets.add(i);
                    finishedWidgets.add(d);
                    finishedWidgets.notifyAll();
                }
             }
         }catch(InterruptedException e)
         {}
         }
    
    public Widget waitForWiget() {
        synchronized (finishedWidgets) {
            if (finishedWidgets.size() == 0) {
                try {
                    finishedWidgets.wait();
                } catch (InterruptedException e) {
                }
            }
            return (Widget) finishedWidgets.remove(0);
        }
    }
}

public class WidgetUser extends Thread{
    private WidgetMaker maker;
    public WidgetUser(String name,WidgetMaker maker){
        super(name);
        this.maker = maker;
    }
    
    public void run(){
        Widget w = maker.waitForWiget();
        System.out.println(getName()+"got a widget");
    }
    
    public static void main(String[] args){
        WidgetMaker maker = new WidgetMaker();
        maker.start();
        new WidgetUser("Lenny", maker).start();
        new WidgetUser("Moe", maker).start();
        new WidgetUser("Curly", maker).start();
    }

}