线程协作示例
假定往篮子里放球与取球的规则如下:篮子只能装一个球;当篮子里无球时才能往里放球;当篮子里有球时才能从中取球。实现这个规则,就是解决两个线程间的协作问题,其程序代码如下:
package com.company;
import java.util.ArrayList;
import java.util.List;
// write your code here
public class WaitNotify {
List<Object> balls = new ArrayList<Object>();
int count_put = 1; //计数
int count_get = 1;
public static void main(String args[]) {
WaitNotify basket = new WaitNotify();//创建被监视的对象
for (int i = 0; i < 3; i++) {
//下面两个线程操作同一对象,需要协作
new Thread(new AddThread(basket)).start();
new Thread(new GetThread(basket)).start();
//如果内部类没有使用static修饰时,则创建内部类实例的方法如下:
//new Thread(new WaitNotify().new GetThread(basket)).start();
}
}
public synchronized void putball(Object ball) {//放球方法
if (balls.size() > 0) {
try {
this.wait(); //阻塞线程
} catch (InterruptedException e) {
}
}
balls.add(ball);
notifyAll();//唤醒阻塞队列的其他线程到就绪队列
System.out.println("放第" + count_put + "个球");
count_put++;
}
public synchronized Object getball(Object ball) {//取球方法
if(balls.size() == 0){
try {
//阻塞线程
this.wait();
} catch (InterruptedException e){
}
}
ball = balls.get(0);
balls.clear();//清空篮子
notifyAll();//唤醒阻塞队列的其他线程到就绪队列
System.out.println("取第" + count_get + "个球");
count_get++;
return ball;
}
static class AddThread extends Thread {//内部静态类,放球线程
private WaitNotify basket;
private Object ball = new Object();
public AddThread(WaitNotify basket) {//构造方法
this.basket = basket;
}
public void run() {
basket.putball(ball);
}
}
static class GetThread extends Thread {//内部静态类,取球线程
private WaitNotify basket;
private Object ball = new Object();
public GetThread(WaitNotify basket) {//构造方法
this.basket = basket;
}
public void run() {
basket.getball(ball);
}
}
}
程序运行结果如图: