java 线程间的通信 (wait / notify / notifyAll)详解编程语言

package waitnotifytest; 
 
import java.util.Collections; 
import java.util.List; 
import com.google.common.collect.Lists; 
 
/** 
 * Test 
 */ 
public class Test { 
 
    private static final Class<Test> lockObj = Test.class; 
 
    private final List<String> list = Collections.synchronizedList(Lists.newArrayListWithCapacity(10)); 
 
    public static void main(String[] args) { 
        Test test = new Test(); 
        test.test(); 
    } 
 
    private void push() { 
        while (list.size() >= 10) { 
            System.out.println("厨师:" + Thread.currentThread().getName() + " 等待中..."); 
            try { 
                synchronized (lockObj) { 
                    lockObj.wait(); 
                } 
            } catch (InterruptedException e) { 
                e.printStackTrace(); 
            } 
        } 
        list.add("item"); 
        list.add("item"); 
        list.add("item"); 
        list.add("item"); 
        list.add("item"); 
        System.out.println("出菜台的菜品数量" + list.size()); 
        synchronized (lockObj) { 
            System.out.println("厨师通知所有人"); 
            lockObj.notifyAll(); 
        } 
    } 
 
    private void popup() { 
        synchronized (lockObj) { 
            while (list.isEmpty()) { 
                try { 
                    System.out.println("服务员:" + Thread.currentThread().getName() + "等待中..."); 
                    lockObj.wait(); 
                } catch (InterruptedException e) { 
                    e.printStackTrace(); 
                } 
            } 
            list.remove(list.size() - 1); 
        } 
        System.out.println("出菜口的菜品数量为:" + list.size()); 
        synchronized (lockObj) { 
            lockObj.notifyAll(); 
        } 
        System.out.println("服务员通知所有人..."); 
    } 
 
    public void test() { 
        Runnable runnable = new Runnable() { 
            @Override 
            public void run() { 
                while (true) { 
                    push(); 
                    try { 
                        Thread.sleep(1000); 
                    } catch (InterruptedException e) { 
                        e.printStackTrace(); 
                    } 
                } 
            } 
        }; 
 
        Runnable runnable2 = new Runnable() { 
            @Override 
            public void run() { 
                while (true) { 
                    popup(); 
                    try { 
                        Thread.sleep(1000); 
                    } catch (InterruptedException e) { 
                        e.printStackTrace(); 
                    } 
                } 
            } 
        }; 
 
        for (int i = 0; i < 2; i++) { 
            Thread thread = new Thread(runnable); 
            thread.start(); 
 
        } 
        for (int i = 0; i < 10; i++) { 
            Thread thread = new Thread(runnable2); 
            thread.start(); 
        } 
 
    } 
}

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/20633.html

(0)
上一篇 2021年7月19日 23:36
下一篇 2021年7月19日 23:36

相关推荐

发表回复

登录后才能评论