为什么在Java中给定的任务中需要线程?

时间:2019-03-21 04:15:01

标签: java multithreading

我不是要完成任务。仔细阅读

  

编写一个程序,模拟在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));
}

}

1 个答案:

答案 0 :(得分:2)

有一个简单的误解:您可以使用多个线程解决问题的事实并不意味着没有其他解决方案。

从技术的角度来看,始终正确(且性能良好)的单线程解决方案总是(几乎)优于复杂的多线程解决方案。

但这不是重点:练习旨在教您如何正确使用多个线程。您可以从观察现实开始:在现实世界中,每条“公共汽车”都有自己的线程。那里的所有巴士彼此独立!因此,需要以某种方式管理它们的交互。对于乘客来说,它们也是具有自己“活动线”的独立对象。

从那里开始,您应该退后一步,首先了解如何设计解决方案,以便每个客户的所有活动都在“个人”线程中进行。