class Resource {
int id;
public Resource(int id) {
this.id = id;
}
public String toString() {
return "" + id;
}
}
class ResourceCoordinator {
Stack resources = new Stack();
public ResourceCoordinator() {
for(int i = 0; i < 4; i++) {
resources.push(new Resource(i));
}
}
public synchronized Resource getResource() {
while(true) {
// リソースが使用可能かチェックする
if (!resources.empty()) {
Resource r = (Resource)resources.pop();
System.out.println("Get resource " + r);
return r;
}
// 使用可能なリソースを待機する
try {
wait();
}
catch(InterruptedException ie) {
ie.printStackTrace();
}
}
}
public synchronized void releaseResource(Resource r) {
// リソースをスタックにプッシュする
System.out.println("Release resource " + r);
resources.push(r);
// 待機中のスレッドすべてに通知を送る
notifyAll();
}
}
class ResourcesTasks {
public static void main(String args[]) {
// リソースの調整役を作成する
ResourceCoordinator rc = new ResourceCoordinator();
// 作業を作成する
for(int i = 0; i < 10; i++) {
new Task(rc, i).start();
}
}
}
上記がソースファイルです。