62,614
社区成员
发帖
与我相关
我的任务
分享
import java.util.Random;
import java.util.concurrent.Semaphore;
public class SynchronizeTest {
//看了文档之后才知道JAVA1.5以后已经有Semaphore了
//对于这个例子由于笼子容量为1,所以只用wait和notify也是可以的,笼子容量更大时就要用到信号量了
Semaphore sCage = new Semaphore(1);
Semaphore sTiger = new Semaphore(1);
Semaphore sPig = new Semaphore(1);
Random rnd = new Random(System.currentTimeMillis());
public void test() {
try {
//初始时笼子里没有动物
sTiger.acquire();
sPig.acquire();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new HunterThread().start();
new FarmerThread().start();
new ZooThread().start();
new HotelThread().start();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new SynchronizeTest().test();
}
class HunterThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
for (;;) {
try {
//为了方便看输出,加入延时
System.out.println("紧张激烈地打猎中...");
sleep(rnd.nextInt(5000));
sCage.acquire();
System.out.println("========放入老虎========");
sTiger.release();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class FarmerThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
for (;;) {
try {
System.out.println("紧张激烈地喂猪中...");
sleep(rnd.nextInt(5000));
sCage.acquire();
System.out.println("========放入猪========");
sPig.release();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class ZooThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
for (;;) {
try {
sTiger.acquire();
System.out.println("========取出老虎========");
sCage.release();
System.out.println("老虎表演中...");
sleep(rnd.nextInt(5000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class HotelThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
for (;;) {
try {
sPig.acquire();
System.out.println("========取出猪========");
sCage.release();
System.out.println("红烧肉制作中...");
sleep(rnd.nextInt(5000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
SC = 1 //
ST = 0 //
SP = 0 //
//猎手进程
for(;;) {
P(SC);
put(tiger);
V(ST);
}
//农夫进程
for(;;) {
P(SC);
put(pig);
V(SP);
}
//动物园进程
for(;;) {
P(ST);
get(tiger);
V(SC);
}
//饭店进程
for(;;) {
P(SP);
get(pig);
V(SC);
}