文章来源:http://blog.sina.com.cn/s/blog_6560efc9010185ej.html
上一篇讲述了线程的互斥(同步),但是在很多情况下,仅仅同步是不够的,还需要线程与线程协作(通信),生产者/消费者模式是一个经典的线程同步以及通信的模型。
- import
java.util.ArrayList; - import
java.util.List; -
- public
class Plate { -
-
List eggs = new ArrayList(); -
-
public synchronized Object getEgg() { -
while (eggs.size() == 0) { -
try { -
wait(); -
} catch (InterruptedException e) { -
e.printStackTrace(); -
} -
} -
Object egg = eggs.get(0); -
eggs.clear();// 清空盘子 -
notify();// 唤醒阻塞队列的某线程到就绪队列 -
System.out.println("拿到鸡蛋"); -
return egg; -
} -
-
public synchronized void putEgg(Object egg) { -
while (eggs.size() > 0) { -
try { -
wait(); -
} catch (InterruptedException e) { -
e.printStackTrace(); -
} -
} -
eggs.add(egg);// 往盘子里放鸡蛋 -
notify();// 唤醒阻塞队列的某线程到就绪队列 -
System.out.println("放入鸡蛋"); -
} -
static class AddThread extends Thread { -
private Plate plate; -
private Object egg = new Object(); -
public AddThread(Plate plate) { -
this.plate = plate; -
} -
public void run() { -
plate.putEgg(egg); -
} -
} -
static class GetThread extends Thread { -
private Plate plate; -
public GetThread(Plate plate) { -
this.plate = plate; -
} -
public void run() { -
plate.getEgg(); -
} -
} -
public static void main(String args[]) { -
Plate plate = new Plate(); -
for(int i = 0; i < 10; i++) { -
new Thread(new AddThread(plate)).start(); -
new Thread(new GetThread(plate)).start(); -
} -
} - }
- 放入鸡蛋
- 拿到鸡蛋
- 放入鸡蛋
- 拿到鸡蛋
- 放入鸡蛋
- 拿到鸡蛋
- 放入鸡蛋
- 拿到鸡蛋
- 放入鸡蛋
- 拿到鸡蛋
- 放入鸡蛋
- 拿到鸡蛋
- 放入鸡蛋
- 拿到鸡蛋
- 放入鸡蛋
- 拿到鸡蛋
- 放入鸡蛋
- 拿到鸡蛋
- 放入鸡蛋
- 拿到鸡蛋
- public
class ThreadTest2 { -
public static void main(String[] args) { -
final Business business = new Business(); -
new Thread(new Runnable() { -
@Override -
public void run() { -
threadExecute(business, "sub"); -
} -
}).start(); -
threadExecute(business, "main"); -
} -
public static void threadExecute(Business business, String threadType) { -
for(int i = 0; i < 100; i++) { -
try { -
if("main".equals(threadType)) { -
business.main(i); -
} else { -
business.sub(i); -
} -
} catch (InterruptedException e) { -
e.printStackTrace(); -
} -
} -
} - }
- class
Business { -
private boolean bool = true; -
public synchronized void main(int loop) throws InterruptedException { -
while(bool) { -
this.wait(); -
} -
for(int i = 0; i < 100; i++) { -
System.out.println("main thread seq of " + i + ", loop of " + loop); -
} -
bool = true; -
this.notify(); -
} -
public synchronized void sub(int loop) throws InterruptedException { -
while(!bool) { -
this.wait(); -
} -
for(int i = 0; i < 10; i++) { -
System.out.println("sub thread seq of " + i + ", loop of " + loop); -
} -
bool = false; -
this.notify(); -
} - }