黑马程序员技术交流社区
标题:
一个关于线程的题目,自己写了下,蒙蒙的!求大神指导!
[打印本页]
作者:
bayshier
时间:
2014-9-14 12:11
标题:
一个关于线程的题目,自己写了下,蒙蒙的!求大神指导!
圣诞老人在睡觉,他只能被以下的两种情况之一唤醒:(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;
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2