1.编写多线程应用程序,模拟多个人通过一个山洞的模拟。这个山洞每次只能通过一个人,每个人通过山洞的时间为5秒,随机生成10个人,
同时准备过此山洞,显示一下每次通过山洞人的姓名。
错误实例如下(虽考虑到对象同步问题,忽略了对象实例化问题,此时以山洞为对象,只能存在单一对象,否则则会成为单线程问题)
public class ThroughCave implements Runnable{
private String name;
public ThroughCave(Stringname) {
// TODOAuto-generated constructor stub
this.name = name;
}
@Override
public void run() {
// TODOAuto-generated method stub
synchronized (this){
try {
Thread.sleep(5000);
} catch(InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
Thread.currentThread().setName(name);
System.out.println(Thread.currentThread().getName()+"已经通过");
}
}
}
public class TestThrough {
public static voidmain(String[] args) {
// TODOAuto-generated method stub
//每次调用线程时都重新new了一个对象,实际则成为了10个线程同时进入10个山洞的问题,
//因此把它看成是多个窗口卖同一组票,但不能重复的问题相同了。
new Thread(newThroughCave("a")).start();
new Thread(new ThroughCave("b")).start();
new Thread(newThroughCave("c")).start();
new Thread(newThroughCave("d")).start();
new Thread(newThroughCave("e")).start();
new Thread(newThroughCave("f")).start();
new Thread(newThroughCave("g")).start();
new Thread(newThroughCave("h")).start();
new Thread(newThroughCave("i")).start();
new Thread(newThroughCave("j")).start();
}
}
修改后的示例如下
public class ThroughCave implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
getThrouth();
}
public synchronized void getThrouth(){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"已经通过");
}
}
public class TestThrough {
public static void main(String[] args) {
// TODO Auto-generated method stub
ThroughCave tc = new ThroughCave();//一个对象
new Thread(tc, "a").start();//调用同一对象,a为线程名,此处可看做人名
new Thread(tc, "v").start();
new Thread(tc, "f").start();
new Thread(tc, "s").start();
}
}