Task2 计算电梯运行时间线程

Task2 计算电梯运行时间线程Task2 计算电梯运行时间线程

大家好,又见面了,我是你们的朋友全栈君。

package main.com.lift;

import com.google.common.collect.Lists;
import com.sun.corba.se.spi.presentation.rmi.IDLNameTranslator;

import java.math.BigDecimal;
import java.util.List;
import java.util.Queue;
import java.util.TreeSet;
import java.util.concurrent.Callable;

public class Task2 implements Callable<Double> {
    public static final double  v=2.5;//电梯平稳运行后的速度
    public static final double a=1; //电梯加速度
    public static final double t1=2.5/1;//电梯加速到平稳速度后
    public static final double h1=2.8;//每层楼高度
    public static final double rt=5;//电梯每到达一层的停留时间

    Queue<Integer> waitqueue;
    public Task2(Queue<Integer> waitqueue){
        this.waitqueue=waitqueue;
    }

    @Override
    public Double call() throws Exception {
        //存放运完该队列所有人需要的总时间、
        double sumTime=0;
        //一次性从等待队列中取电梯的最大容量的个数
        while(!waitqueue.isEmpty()){
            int maxvolume =10;
            List<Integer> oncerun= Lists.newArrayList();
            do{
                synchronized (waitqueue){
                    if(!waitqueue.isEmpty()){
                        oncerun.add(waitqueue.poll());
                    }else {
                        break;
                    }
                }
                maxvolume--;
            }while (maxvolume>0);
            //电梯装满人后开始运行
            //1,先排序,并去重
            List<Integer> lists=Lists.newArrayList(new TreeSet<>(oncerun));
            //2,开始运行,每到达一层让其睡眠到达改成需要的时间,还有睡眠停留在改层需要的时间
            double timesum=0;
            int tmp=0;
            for(int k=0;k<lists.size();k++){
                //到达该层后先睡眠5秒
                Thread.sleep((long)rt);
                timesum+=rt;
                double time=getnTime(lists.get(k)-tmp);
                timesum+=time;
                //睡眠上楼需要的时间
                Thread.sleep((long)time);
                tmp=lists.get(k);
            }
            //下电梯需要的时间,并睡眠,直接直达
            double downTime=getnTime(getMaxFromList(lists));
            Thread.sleep((long)downTime);
            sumTime+=(timesum+downTime);
        }
        return sumTime;
    }

    /**
     * 获取lists中最大值
     * @param list
     * @return
     */
    public Integer getMaxFromList(List<Integer> list){
        int temp=0;
        for(Integer ints:list){
            if(ints>temp){
                temp=ints;
            }
        }
        return temp;
    }

    /**
     * 运行n层需要的时间
     * @param n
     * @return
     */
    public double getnTime(int n){
        //电梯只在加减速中运行需要的时间
        if(!isgetspeedest(h1*n)){
            double t1high=Math.sqrt(chufa(h1*n,a));
            return t1high*2;
        }else {
            double t2high=chufa(h1*n-getaddormineS(),v);
            return t2high+t1*2;
        }
    }
    public boolean isgetspeedest(double h){
        //刚好达到最大速度时,加速和减速走的总路程
        double s=getaddormineS();
        return s<h;
    }

    public double getaddormineS(){//获取在加速和减速期间运行的总路程
        return 0.5*a*t1*t1*2;
    }
    public double chufa(double a,double b){
        BigDecimal beichushu=new BigDecimal(a);
        BigDecimal chushu=new BigDecimal(b);
        return beichushu.divide(chushu).doubleValue();
    }
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/105942.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 在线学习Java的资源网站

    CodeGym(https://codegym.cc/):一个在线Java编程课程,80%的内容是练习,适合一窍不通的入门者。 CodeAcademy(https://www.codecademy.com/):该课程注重的是在找工作时非常有用的技术能力。 除此之外还有在线视频课程,如Coursera(https://www.coursera.org/)或Udemy(ht…

    2022年4月3日
    659
  • 语义分割 实例分割 全景分割_语义分割转实例分割

    语义分割 实例分割 全景分割_语义分割转实例分割之前看过一篇使用分割思想进行目标检测,所以这里补习下一些分割相关的基础知识。这里重点说下语义分割、实力分割和全景分割的区别。1、semanticsegmentation(语义分割)通常意义上的目标分割指的就是语义分割,图像语义分割,简而言之就是对一张图片上的所有像素点进行分类语义分割(下图左)就是需要区分到图中每一点像素点,而不仅仅是矩形框框住了。但是同一物体的不同实例不需要单独分…

    2022年8月23日
    9
  • Vue 绑定使用 touchstart touchmove touchend[通俗易懂]

    Vue 绑定使用 touchstart touchmove touchend[通俗易懂]Vue简单绑定touchstarttouchmovetouchend

    2022年6月19日
    96
  • DNS多点部署IP Anycast+BGP实战分析

    DNS多点部署IP Anycast+BGP实战分析DNS领域的多点部署大多采用IPAnycast+BGP方式,采用这种方式不需要额外采购设备,部署灵活多样。但像其他所有技术一样,IPAnycast+BGP技术只有在适当的领域和范围内才能发挥它的最大优势。Internet不断发展,上网人群数量增加,多数网站或DNS等服务在使用单节点提供服务的情况下,无论服务器性能还是接入带宽都不足以承载大量的用户服务请求;而在国内运营商网络之间访问缓慢的

    2022年5月23日
    83
  • ThreadPoolTaskExecutor和ThreadPoolExecutor区别

    ThreadPoolTaskExecutor和ThreadPoolExecutor区别之前工作中发现有同事在使用线程池的时候经常搞混淆ThreadPoolTaskExecutor和ThreadPoolExecutor,座椅在这里想写一片博客来讲讲这两个线程池的区别以及使用ThreadPoolExecutor这个类是JDK中的线程池类,继承自Executor,Executor顾名思义是专门用来处理多线程相关的一个接口,所有县城相关的类都实现了这个接口,相关的继承实现类图如下…

    2022年7月26日
    14
  • var let和const的区别_const声明

    var let和const的区别_const声明1.let命令基本语法ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。{leta=1varb=2console

    2022年8月7日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号