圣诞老人在睡觉,他只能被以下的两种情况之一唤醒:(1)所有的九头驯鹿全部回来了,(2)某些孩子做玩具的时候遇到了困难,为了让圣诞老人多睡一会,只有三个以上的孩子遇到困难以后才会唤醒。当这三个孩子的问题得到解决时,其它的孩子必须等到那些孩子返回,才可以继续提问。如果圣诞老人醒来以后发现有三个孩子在等待,但最后一头驯鹿也回来了,这时圣诞老人准备让小孩子等待到他为所有的驯鹿都帮好雪撬以后,因为他认为准备雪撬比小孩子做玩具要重要一点。(用信号量编程完成这个程序)- public class Christmas {
- public static void main(String[] args) {
- new Christmas();
- }
-
- // 圣诞老人的信号量
- OldMan[] ooMans = new OldMan[1];
- private Semaphore oldman = new Semaphore(0);
- Semaphore oldworkSemaphore = new Semaphore(1);
-
-
- // 小孩的信号量
- private Semaphore child = new Semaphore(3);
- Semaphore chSemaphore = new Semaphore(1);
-
- // 鹿的信号量
- private Semaphore deer = new Semaphore(9);
- Semaphore deSemaphore = new Semaphore(1);
- // 小孩的计数器
- private int countchild = 0;
- // 鹿的计数器
- private int countdeer = 0;
- // 小孩子list
- List<Child> listC = new ArrayList<Child>();
- // 鹿数组
- Deer[] deers = new Deer[]{new Deer(1),new Deer(1),new Deer(2),new Deer(3),new Deer(4),
-
- new Deer(5),new Deer(6),new Deer(7),new Deer(8),new Deer(9)};
- public Christmas() {
-
-
-
- for (int i = 0; i < ooMans.length; i++) {
- ooMans[i] = new OldMan(i);
- ooMans[i].start();
- }
-
-
- Timer timer = new Timer();
- timer.schedule(new Mtimer(), 0, 5000);
-
- for (int i = 1; i<1000; i++) {
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- }
- Child c = new Child(i);
- // listC.add(c);
- c.start();
- }
-
- }
- class Mtimer extends TimerTask{
- public void run() {
- for (int i = 1; i < deers.length; i++) {
- try {
- Thread.sleep(200);
- } catch (InterruptedException e) {
- }
- deers[i] = new Deer(i);
- deers[i].start();
- }
- }}
-
-
- // 圣诞老人
- class OldMan extends Thread {
-
- Child childcChild = null;
- Deer deerdDeer = null;
-
- int oldmanId = 0 ;
-
- public volatile String state = "空闲";
- public OldMan(int i) {
- this.oldmanId = i;
- }
-
- public void run() {
- while (true) {
- try {
- //圣诞老人在睡觉 等待被 唤醒
- oldman.acquire();
- checkstate();
- oldworkSemaphore.acquire();
- System.out.println("圣诞老人被叫醒了,看看是谁叫醒了他!");
- oldWork();
- oldworkSemaphore.release();
-
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
-
- //圣诞老人的工作方法
- public void oldWork() {
- //先判读鹿 在判读孩子 鹿比孩子重要
- if (countdeer == 9) {
- System.out.println("9头驯鹿叫醒了圣诞老人!");
- System.out.println("鹿都回来了,绑雪橇!");
- countdeer = 0 ;
- deer.release(9);
- System.out.println("绑好雪橇去休息了!");
- state = "空闲";
- deerdDeer.state = "出去";
- } else if (countchild == 3){
- System.out.println("3个孩子叫醒了圣诞老人!");
- System.out.println("有3个孩子有困难,帮孩子解决问题");
- countchild = 0 ;
- child.release(3);
- System.out.println("解决完孩子们的困难去休息了!");
- state = "空闲";
- childcChild.state = "有困难,找圣诞老人!";
- }
- }
-
- //判断圣诞老人的状态
- private void checkstate(){
- while(!"繁忙".equals(state)){
- //如果是满的状态就卧倒,让出执行权 ,线程并没有销毁 ,先进栈的会先出栈
- yield();
- }
- }
- public void setchild(Child child) {
- this.childcChild = child;
- }
- public void setdeer(Deer deer) {
- this.deerdDeer = deer;
- }
-
- }
- // 孩子
- class Child extends Thread {
-
- OldMan ooMan;
-
- int childID ;
-
- public volatile String state = "玩玩具";
- // public volatile String state = "有困难,找圣诞老人!";
-
- public Child(int id) {
- this.childID = id;
- }
-
- public void run() {
- try {
- //检查孩子自身的初始状态
- checkstate2();
- //来了一个孩子 孩子的信号量就减一
- child.acquire();
- //同时孩子的计数器就加一
- countchild++;
- System.out.println(childID+"号孩子有困难!");
- //如果有3个孩子 就叫醒圣诞老人
- chSemaphore.acquire();
- if (countchild == 3){
- checkstate();
- oldman.release();
- }
- chSemaphore.release();
-
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
-
- //判断圣诞老人处于什么状态 空闲了就取得圣诞老人
- private void checkstate() {
-
- OldMan oldMan = null;
-
- //凑齐3个孩子 去取得圣诞老人
- AA: while (true) {
- for (int i = 0; i < ooMans.length; i++) {
- if (ooMans[i].state == "空闲") {
- oldMan = ooMans[i] ;
- break AA;
- }
- }
- }
-
- oldMan.setchild(this);
- this.setold(oldMan);
- oldMan.state = "繁忙";
- }
- private void setold(OldMan oldMan) {
- this.ooMan = oldMan;
- }
-
- //孩子的初始状态
- private void checkstate2(){
- try {
- System.out.println(childID+"号玩玩具!");
- sleep(500);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- state = "有困难,找圣诞老人!";
-
- while(!"有困难,找圣诞老人!".equals(state)){
- //如果是满的状态就卧倒,让出执行权 ,线程并没有销毁 ,先进栈的会先出栈
- yield();
- }
- }
-
- }
- // 驯鹿
- class Deer extends Thread {
- OldMan oooMan;
-
- public int deerid;
- public volatile String state = "出去";
-
- public Deer(int id) {
- this.deerid = id;
- }
- public void run() {
-
- // while (true) {
- try {
- //回来一只鹿 鹿的信号量就减一
- deer.acquire();
-
- //鹿的计数器就加一
- deSemaphore.acquire();
- countdeer++;
- System.out.println(deerid+"号鹿"+"回来了");
-
- //如果9只鹿都回来了就 叫醒圣诞老人
- if (countdeer == 9 ){
- state = "都回来了";
- checkstate();
- oldman.release();
- }
- // else {
- // yield();
- // }
- deSemaphore.release();
-
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- // }
- }
-
- //判断圣诞老人处于什么状态 空闲了就取得圣诞老人
- private void checkstate() {
-
- OldMan oldMan = null;
-
- // //判断所有的鹿都回来了没有
- // if("出去".equals(state)){
- // //如果是满的状态就卧倒,让出执行权 ,线程并没有销毁 ,先进栈的会先出栈
- // yield();
- // }
-
- //凑齐9只鹿 判断圣诞老人是不是空闲的状态
- AA: while (true) {
- for (int i = 0; i < ooMans.length; i++) {
- if (ooMans[i].state == "空闲") {
- oldMan = ooMans[i] ;
- break AA;
- }
- }
- }
-
- oldMan.setdeer(this);
- this.setold(oldMan);
- oldMan.state = "繁忙";
- }
-
- private void setold(OldMan oldMan) {
- this.oooMan = oldMan;
- }
- }
- }
复制代码 |
|