我不是要完成任务。仔细阅读
编写一个程序,模拟在5个不同站点之间行驶的公交车, 重复循环,每辆巴士最多可容纳50人 车站随机人数下车和随机人数 人员上车,请考虑以下情况。
- 如果公共汽车没有足够的空间容纳所有人,则必须 呆在下一周期的车站
- 只有先下车的人才能上车。
- 您可以模拟公交车行程,每个站点之间的固定延迟时间为 模拟旅行时间。
- 在公交车到达公交车站之前,人员无法安装/拆卸公交车 指定站。
使用信号量控制对总线的访问,并使用其他实用程序控制访问 去公交车。使用线程池来管理线程管理。您可以使用闩锁 循环屏障,重入锁和条件变量来编写代码。
我已经在Java中实现了这一点,而没有创建线程和使用信号量。我只是使用嵌套循环来循环总线,整个过程运行良好。我并不是要你做作业,我只需要知道在此代码中应该在哪里使用线程。
这是我的代码:
import java.util.*;
import java.lang.*;
public class buses {
int capacity;
int station;
ArrayList<Integer> remaining=new ArrayList<>();
public void run(int n) {
System.out.println("--Station "+(n+1)+"--");
if(this.capacity<50)
{
Random rand1 = new Random();
int unload = rand1.nextInt(50);
unload += 1;
while(unload>50-this.capacity)
{
rand1 = new Random();
unload = rand1.nextInt(50);
unload += 1;
}
System.out.println("Unloaded : "+unload);
this.capacity+=unload;
System.out.println("Capacity "+this.capacity);
}
Random rand = new Random();
int load = rand.nextInt(50);
load += 1;
System.out.println("random load:"+load);
int val=remaining.get(n);
System.out.println("Remaining pessenger at station"+(n+1)+" were:"+val);
load=load+val;
System.out.println("random load:"+load);
if(load<=this.capacity)
{
System.out.println("Loaded "+(load));
capacity-=load;
System.out.println("Capacity "+this.capacity);
remaining.set(n, 0);
}
else if(load>this.capacity)
{
int notToBeLoaded=load-this.capacity;
System.out.println("Loaded "+(load-notToBeLoaded));
capacity=0;
System.out.println("Capacity "+this.capacity);
remaining.set(n, notToBeLoaded);
}
station++;
}
public buses()
{
this.capacity=50;
this.station=1;
this.delay=2000;
}
public static void main(String[] args) {
buses obj=new buses();
obj.remaining.add(0);
obj.remaining.add(0);
obj.remaining.add(0);
obj.remaining.add(0);
obj.remaining.add(0);
for(int j=0;j<2;j++)
{
for(int i=0;i<5;i++)
{
obj.run(i);
}
}
//System.out.println("remaining 0:"+obj.remaining.get(0));
//System.out.println("remaining 1:"+obj.remaining.get(1));
//System.out.println("remaining 2:"+obj.remaining.get(2));
//System.out.println("remaining 3:"+obj.remaining.get(3));
//System.out.println("remaining 4:"+obj.remaining.get(4));
}
}
答案 0 :(得分:2)
有一个简单的误解:您可以使用多个线程解决问题的事实并不意味着没有其他解决方案。
从技术的角度来看,始终正确(且性能良好)的单线程解决方案总是(几乎)优于复杂的多线程解决方案。
但这不是重点:练习旨在教您如何正确使用多个线程。您可以从观察现实开始:在现实世界中,每条“公共汽车”都有自己的线程。那里的所有巴士彼此独立!因此,需要以某种方式管理它们的交互。对于乘客来说,它们也是具有自己“活动线”的独立对象。
从那里开始,您应该退后一步,首先了解如何设计解决方案,以便每个客户的所有活动都在“个人”线程中进行。