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