Java多线程模拟多人过山洞

时间:2022-12-29 18:04:39
编写多线程应用程序,模拟多个人通过一个山洞。 这个山洞每次只能通过一个人,每个人通过山洞的时间为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);
	}
}