Java多线程模拟多人过山洞

时间:2022-12-29 18:19:00
编写多线程应用程序,模拟多个人通过一个山洞。这个山洞每次只能通过一个人,每个人通过山洞的时间为5秒,随机生成10个人,同时准备过此山洞,显示一下每次通过山洞人的姓名。 思路:这里随机生成10个人,就好比是10个线程,并发的执行,它们竞争这个山洞的通过权,同时,每个人通过山洞的时间是5s。但是这里随机的意思,不知道是通过的顺序有随机性,还是生成人的名字的随机,但是我感觉,这里如果是随机生成人名,好像并没有什么意义,既然是多线程的编程,所以我的理解是通过的顺序要是随机的。 解决办法:使用线程回调的方法,将10个人的名字定义在回调类中,共享给其他10个线程,然后每个线程在输出人名的时候,给它进行同步,也就是将获得人名的方法进行同步操作,同时延迟5s输出人名,模拟通过时间为5s。 具体代码: 回调类:
package com.xgd.thread.test;
/**
* Package: com.xgd.thread.test
*
* File: ThroughCave.java
*
* Author: jiangpan Date: 2015年9月21日
*
* Copyright @ 2015 Corpration Name
*
*/
public class ThroughCave {

private String[] name;

public ThroughCave() {
//在构造方法中初始化一个包含10个人名的String数组
String[] name = {"张三","李四","王五","马六","牛七","王八","小明","小红","小花","小雷"};
this.name = name;
}

//输出人名的方法,同步化synchronized
public synchronized void PrintName(String name){
//延迟5s,模拟过山洞的时间为5s
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(name);
}
//将10个人名分给10个线程,模拟10个人
public void SendAllNames(){
for (int i = 0; i < name.length; i++) {
GetNameThread gt = new GetNameThread(this, name[i]);
gt.start();

}
}

public static void main(String[] args){
ThroughCave tc = new ThroughCave();
tc.SendAllNames();
}
}


线程类:
package com.xgd.thread.test;
/**
* Package: com.xgd.thread.test
*
* File: GetNameThread.java
*
* Author: jiangpan Date: 2015年9月21日
*
* Copyright @ 2015 Corpration Name
*
*/
public class GetNameThread extends Thread{

private ThroughCave tcave;
private String name;
//初始化线程的时候,获得回调类对象和人名
public GetNameThread(ThroughCave tcave,String name) {
this.tcave = tcave;
this.name = name;
}

public void run(){
//输出人名,模拟过山洞
tcave.PrintName(name);
}
}