/*1.编写多线程应用程序,模拟多个人通过一个山洞的模拟。
这个山洞每次只能通过一个人,每个人通过山洞的时间为5秒,随机生成10个人,
同时准备过此山洞,显示一下每次通过山洞人的姓名。*/
//Person类 具有的属性是人的姓名,因为要记录每次通过山洞人的姓名。
//Person类 有没有方法呢 ?人要通过山洞,即人要调用过山洞这个方法。方法可以在Person类中,当然在山洞类中最好
public class Person {
private String name;
public Person(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package cn.scxh.java.thread;
//Cave类中最重要的是过山洞这个方法,因为这个方法需要人去调用
public class Cave {
/*由于过山洞是共享数据必须加synchronized,可以将synchronized理解为一把锁
只有当目前这个人通过了下个人才能通过,避免一开线程,都用这条资源*/
public synchronized void crossCave(Person person){
//人正在通过山洞
//人休眠5秒
//人通过了山洞
System.out.println(person.getName()+"正准备通过山洞");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(person.getName()+"已经通过山洞");
}
}
package cn.scxh.java.thread;
public class PersonCave implements Runnable{
//开启线程
private Cave cave;
private Person person;
public PersonCave(Cave cave, Person person) {
super();
this.cave = cave;
this.person = person;
}
@Override
public void run() {
// TODO Auto-generated method stub
cave.crossCave(person);
}
}
package cn.scxh.java.thread;
public class TestPersonCave {
//测试类
public static void main(String[] args) {
// TODO Auto-generated method stub
Cave cave = new Cave();
String[] name = {"a","b","c","d","e","f"};
for (String string : name) {
Person person = new Person(string);
PersonCave pc = new PersonCave(cave,person);
Thread t1 = new Thread(pc);
t1.start();
}
}
}