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


相关推荐

  • ubuntu完全卸载CUDA

    ubuntu完全卸载CUDACUDA的卸载方法网上都有很多,但是几乎都是错的,我在卸载cuda时基本试了个遍,各种踩坑。能查到的方法一般都是从官方文档搬过来的,然而这种方法并不能将cuda完全卸掉。这里把官方文档的方法贴出来:sudoapt-get–purgeremove”*cublas*””*cufft*””*curand*”\”*cusolver*””*cusparse*””*npp*””*nvjpeg*””cuda*””nsight*”我运行过这个命令,运行完之后,命令行输入nvcc-

    2022年5月30日
    78
  • HP-UX 六大虚拟化技术之“网络”

    HP-UX 六大虚拟化技术之“网络”

    2021年8月5日
    42
  • Latex 参考文献上标

    Latex 参考文献上标1.如何使连续的参考文献能够中间用破折号连起来?比如[6,7,8,9]变成[6-9]?方法:在文档开始前加上下面的语句命令\usepackage[numbers,sort&compress]{natbib}不但可以压缩参考文献标号,还可以进行排序,即无论正文里面的顺序怎样,显示出来都是先后顺序。在elsevier模板中,natbib包已经默认引用了,无需重新引用,改一下natb

    2025年10月16日
    2
  • pidstat_使用pidstat查看进程资源使用情况

    pidstat_使用pidstat查看进程资源使用情况引言在查看系统资源使用情况时,很多工具为我们提供了从设备角度查看的方法。例如使用iostat查看磁盘io统计信息:linux:~#iostat-d3Device:tpsBlk_read/sBlk_wrtn/sBlk_readBlk_wrtnsda1.670.0040.000…

    2025年5月23日
    4
  • win32怎么用_win32function failed

    win32怎么用_win32function failedHWNDhwndFound//=FindWindow(_T("RC352_Win32"),NULL); =GetConsoleWindow();

    2022年8月5日
    7
  • 深入浅出MFC.pdf

    深入浅出MFC.pdf下载地址:网盘下载内容简介······《深入浅出MFC》分为四大篇。第一篇提出学习MFC程序设计之前的必要基础,包括Widnows程序的基本观念以及C++的高阶议题。“学前基础”是相当主观的认定,但作者是甚于自己的学习经验以及教学经验,其挑选应该颇具说服力。第二篇介绍VisualC++整合环境开发工具。此篇只是提纲挈领,并不企图取代Visual…

    2022年6月16日
    34

发表回复

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

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