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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 朋友圈集赞图片生成器_朋友圈集赞神器

    朋友圈集赞图片生成器_朋友圈集赞神器大家好这是一款朋友圈积攒截图小程序里面内涵三款样式生成,一款图文,一款分享,一款查看的样式也就是我们威信朋友圈所用到的样式就包含了那些可以用户自由的添加哈!赞的数量那些可以用户自定义的哈另外所需的内容也是用户自定义的安装方法的话和往常一样!直接威信开发者工具打开源码然后设置一个合法域名上传审核就可以了合法域名在压缩包里面,搭建解压了就可以看到了下面让我们来看看小编的测试演示图:小程序源码下载地址:(已更新)朋友圈集赞万能截图生成器威信小程序源码下载-小程序文.

    2022年9月5日
  • VARIANT、COleVariant 和_variant_t

    VARIANT、COleVariant 和_variant_t 在OLE、ActiveX和COM中,VARIANT数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。下面让我们来看看OAIDL.H文件中VARIANT定义的一个简化版:structtagVARIANT{ VARTYPEvt; union{  shortiVal;//VT_I2.  longlVal;//VT

    2022年7月18日
  • Java中的5大队列,你知道几个?

    Java中的5大队列,你知道几个?本文已收录至https://github.com/vipstone/algorithm《算法图解》系列。通过前面文章的学习《一文详解「队列」,手撸队列的3种方法!》我们知道了队列(Queue)是

    2022年7月2日
  • oracle sequence order_oracle session

    oracle sequence order_oracle session在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。  1、Create Sequence  你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限,  CREATE SEQUEN

    2022年10月10日
  • Java安全之挖掘回显链

    Java安全之挖掘回显链0x00前言前文中叙述反序列化回显只是为了拿到Request和Response对象。在这里说的的回显链其实就是通过一连串反射代码获取到该Request对象。在此之前想吹

    2021年12月13日
  • windows关闭端口方法[通俗易懂]

    windows关闭端口方法[通俗易懂]windows关闭端口方法在介绍各种端口的作用前,这里先介绍一下在Windows中如何关闭/打开端口,因为默认的情况下,有很多不安全的或没有什么用的端口是开启的,比如Telnet服务的23端口、FT

    2022年8月5日

发表回复

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

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