编写多线程应用程序,模拟多个人通过一个山洞

Java实现:多线程模拟多人通过单通道
本文介绍了如何使用Java编写一个多线程程序,模拟多个随机生成的人依次通过一个只能容纳一人的山洞。每个人通过山洞耗时5秒,并详细展示了通过者的名字。程序还进一步扩展,增加了人员的年龄属性,展示通过山洞时的姓名及年龄信息。

【17】编写多线程应用程序,模拟多个人通过一个山洞。山洞每次只能通过一个人,每个人通过山洞的时间为5秒,随机生成10个人,同时准备过此洞,显示每次通过者的姓名。

public class Test
{
	public static void main(String[] args)
	{
		Cave cave=new Cave();
		new Thread(cave,"1").start();
		new Thread(cave,"2").start();
		new Thread(cave,"3").start();
		new Thread(cave,"4").start();
		new Thread(cave,"5").start();
		new Thread(cave,"6").start();
		new Thread(cave,"7").start();
		new Thread(cave,"8").start();
		new Thread(cave,"9").start();
		new Thread(cave,"10").start();
	}
}

class Cave extends Thread
{
	public void run()
	{
		synchronized(this)
		{
			System.out.println(Thread.currentThread().getName()+"正在通过,请等待5s");
			try {
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

随机生成5个人,同时准备过此山洞,显示一下每次通过山洞人的姓名及年龄。

public class Test1 {
	public static void main(String[] args) {
		demo();
	}
	private static void demo() {
		Person p1=new Person("1",18);
		Person p2=new Person
### 多线程编程实现山洞通行模拟 #### 使用互斥锁控制线程的必要性 在多线程环境中,当个线程试图同时访问或修改共享资源时,可能会引发数据不一致或其他不可预测的行为。为了防止这种情况发生,可以使用互斥锁来保护临界区[^1]。 以下是基于Python和Java两种语言编写山洞通行模拟程序示例: --- #### Python 实现 ```python import threading import time class CavePassageSimulation: def __init__(self): self.lock = threading.Lock() # 创建互斥锁对象 def pass_cave(self, thread_name): with self.lock: # 加锁操作 print(f"{thread_name} 进入山洞...") time.sleep(2) # 模拟通过时间 print(f"{thread_name} 完成山洞通行。\n") def main(): simulation = CavePassageSimulation() threads = [] for i in range(5): # 创建5个线程代表不同的角色进入山洞 t = threading.Thread(target=simulation.pass_cave, args=(f"角色 {i+1}",)) threads.append(t) t.start() for t in threads: # 等待所有线程完成 t.join() if __name__ == "__main__": main() ``` 上述代码中,`Lock()` 被用来确保每次只有一个线程能够执行 `pass_cave` 方法中的逻辑,从而避免并发冲突[^3]。 --- #### Java 实现 ```java public class CavePassageSimulation { private final Object lock = new Object(); // 创建互斥锁对象 public void passCave(String threadName) { synchronized (lock) { // 同步块加锁 System.out.println(threadName + " 进入山洞..."); try { Thread.sleep(2000); // 模拟通过时间 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(threadName + " 完成山洞通行.\n"); } } public static void main(String[] args) { CavePassageSimulation simulation = new CavePassageSimulation(); Thread[] threads = new Thread[5]; for (int i = 0; i < 5; i++) { // 创建5个线程代表不同的角色进入山洞 int index = i; threads[i] = new Thread(() -> simulation.passCave("角色 " + (index + 1))); threads[i].start(); } for (Thread t : threads) { // 等待所有线程完成 try { t.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` 在这个例子中,`synchronized` 关键字用于创建一个同步块,保证在同一时刻只允许一个线程进入该区域[^2]。 --- #### 解决资源共享问题的关键点 无论是Python还是Java,在多线程环境下都需要一种机制来协调线程对共享资源的竞争。这里使用的互斥锁是一种简单而有效的解决方案,它能确保同一时间内只有单一线程可以访问特定的代码段或资源。 需要注意的是,虽然互斥锁解决了大部分竞态条件问题,但在某些复杂场景下可能引入死锁风险。因此,在设计程序时应特别注意避免循环依赖的情况。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值