ExecuteRun「建议收藏」

ExecuteRun「建议收藏」ExecuteRun

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

package main.com.lift;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

import java.lang.annotation.Target;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.*;

public class ExecuteRun {
    public double runanswer(List<List<Integer>> produceElem, LinkedBlockingQueue<Integer> queue)throws  Exception{
        CyclicBarrier cyclicBarrier=new CyclicBarrier(produceElem.size());
        List<Thread> threads= Lists.newArrayList();
        Map<String, FutureTask> futureTaskMap= Maps.newHashMap();
        for(int i=0;i<produceElem.size();i++){
            Task task=new Task(cyclicBarrier,produceElem.get(i),queue);
            FutureTask futureTask=new FutureTask(task);
            Thread childThread=new Thread(futureTask,"lift"+i);
            threads.add(childThread);
            childThread.start();
            futureTaskMap.put("lift"+i,futureTask);
        }
        for (Thread thread:threads){
            try{
                thread.join();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        //数据分布好后,每个电梯消费各自队列,每次消费5个人
        Map<String,FutureTask> futureTaskMap2=Maps.newHashMap();
        for(int i=0;i<produceElem.size();i++){
            //获取该电梯的等待队列
            Queue<Integer> waitqueue=(Queue<Integer>) futureTaskMap.get("lift"+i).get();
            Task2 task2=new Task2(waitqueue);
            FutureTask<Double> futureTask=new FutureTask<>(task2);
            Thread childThread=new Thread(futureTask,"lift"+i);
            futureTaskMap2.put("lift"+i,futureTask);
            childThread.start();
        }
        //存放所有电梯的运行时间
        Map<String,Double> sumTime=Maps.newHashMap();

        //**********************************************不开启监控***************************************************
//        for(Map.Entry<String,FutureTask> entry:futureTaskMap2.entrySet()){
//            String item2=entry.getKey();
//            FutureTask intlift=entry.getValue();
//            //如果自己的线程消费完了,区分担其他线程的
//            if(intlift.get()!=null){
//                try{
//                    sumTime.put(item2,(double)intlift.get());
//
//                }catch (Exception e){
//                    e.printStackTrace();
//                }
//            }
//        }
        //****************************************开启监控*******************************************
        //监控线程是否结束
        int mapsize=0;
        List<Thread> allThread=Lists.newArrayList();
        List<Callable> allCallable=Lists.newArrayList();
        do{
            for(Map.Entry<String,FutureTask> entry:futureTaskMap2.entrySet()){
                String item2=entry.getKey();
                FutureTask intlift=entry.getValue();
                //如果自己的线程消费完了后,去分担其他线程的
                if(intlift.get()!=null){
                    mapsize++;
                    try{
                        sumTime.put(item2,(double)intlift.get());
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                    Thread t=new Thread(new Runnable() {
                        @Override
                        public void run() {
                            //一个电梯运完自己队列里的人后,去其他的队列中去找有没有符合自己能到达楼层的人
                            List<Integer> lift=produceElem.get(Integer.parseInt(item2.substring(4,item2.length())));
                            //存放新建的线程
                            Map<String,FutureTask> futureTaskMapson=Maps.newHashMap();
                            futureTaskMap.forEach((item,intperson) ->{
                                try{
                                    Queue<Integer> waitqueue2=(Queue<Integer>) intperson.get();
                                    //检查遍历到的队列,如果有元素在可以消费的队列中,就加入消费,并删除
                                    synchronized (waitqueue2){
                                        if(!waitqueue2.isEmpty()){
                                            Queue<Integer> waitqueuSon=Lists.newLinkedList();
                                            for(int x=0;x<waitqueue2.size();x++){
                                                if(lift.contains(x)){
                                                    waitqueuSon.offer(x);
                                                    ((LinkedList<Integer>) waitqueue2).remove(x);
                                                    x--;
                                                }
                                                if(waitqueuSon.size()==5 || waitqueue2.size()==0){
                                                    break;
                                                }
                                            }
                                            if(waitqueuSon.size()<=0){
                                                return;
                                            }
                                            //取到后新启一个线程消费
                                            Task2 taskson=new Task2(waitqueuSon);
                                            FutureTask<Double> futureTask=new FutureTask<>(taskson);
                                            if(futureTaskMapson.get(item2) ==null){
                                                futureTaskMapson.put(item2,futureTask);
                                            }else {
                                                //否则就先拿到之前运行的时间,在放进去新的执行
                                                double itemson=(double)futureTaskMapson.get(item2).get();
                                                sumTime.put(item2,sumTime.get(item2)+itemson);
                                                futureTaskMapson.put(item2,futureTask);
                                            }
                                            allCallable.add(taskson);
                                            futureTask.run();
                                        }
                                    }
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            });
                            int mapsize2=0;
                            //所有运行完了之后就再次清算新建的自消费线程
                            do{
                                for(Map.Entry<String,FutureTask> entry2:futureTaskMapson.entrySet()){
                                    String item2son=entry2.getKey();
                                    FutureTask intliftson=entry2.getValue();
                                    try{
                                        if(intliftson.get()!=null){
                                            mapsize2++;
                                            try{
                                                double itemson=(double)intliftson.get();
                                                if(sumTime.get(item2son)!=null){
                                                    sumTime.put(item2son,sumTime.get(item2son)+itemson);
                                                }
                                            }catch (Exception e){
                                                e.printStackTrace();
                                            }
                                        }
                                    }catch (Exception e){
                                        e.printStackTrace();
                                    }
                                }
                            }while (mapsize2<futureTaskMapson.size());
                        }
                    });
                    allThread.add(t);
                    t.start();
                }
            }
        }while (mapsize<futureTaskMap2.size());
        //都结束了,看结果
        System.out.println(" ");
        sumTime.forEach((k,v) ->{
            System.out.println(k+" : "+ v);
        });
        allThread.forEach(thread -> {
            try{
                thread.join();
            }catch (Exception e){
                e.printStackTrace();
            }
        });
        double maxtime=0;
        for(Map.Entry<String,Double> entry:sumTime.entrySet()){
            if(maxtime<entry.getValue()){
                maxtime=entry.getValue();
            }
        }
        return  maxtime;
    }

}

 

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

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

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


相关推荐

  • uat环境和生产环境的区别_angular 生产环境 相对路径无效

    uat环境和生产环境的区别_angular 生产环境 相对路径无效 本人研发小白一名,时间:2017年12月21(周四),坐标:上海。项目上线,测试环境正常,上UAT环境后访问不到数据,于是开始步步分析,细细琢磨,最终成功上UAT,但影响了上生产环境的时间,造成项目延时发布,第一次遇到这么奇怪的事情,之后就是2017年12月26(周二)的上生产环境,不过可怕的事情还是发生了:本地、测试、UAT环境都正常,生产环境有访问不到数据,直到12月27号2:00才解决,…

    2022年9月30日
    1
  • python控制mt4自动交易软件下载_MT4 EA智能自动交易系统使用教程[通俗易懂]

    python控制mt4自动交易软件下载_MT4 EA智能自动交易系统使用教程[通俗易懂]1.首先,你要有一个EA,必须要有以ex4为扩展名的,如果只有mq4文件的话,就要用MetaTrader自带的编辑器MetaEditor打开,将mq4通过编译(compile)并且要不出现错误,才能在原存放mq4的文件夹下面得到一个同名的ex4文件。2.将这个ex4文件复制到MetaTrader4所在的文件夹下面的experts文件夹下,比如:D:\ProgramFiles\ACTCMeta…

    2022年5月30日
    77
  • C#的Button.DialogResult属性[通俗易懂]

    C#的Button.DialogResult属性[通俗易懂]如果此属性的DialogResult不是设置为None,并且父窗体是通过ShowDialog方法显示的,则不必挂钩任何事件,单击按钮也可关闭父窗体。然后,该窗体的DialogResult属性将设置为该按钮被单击时的DialogResult。例如,若要创建一个“是/否/取消”对话框,只需添加三个按钮并将其DialogResult属性分别设置为Yes、No和Cancel即可。…

    2022年6月22日
    23
  • Futex系统调用,Futex机制,及具体案例分析[通俗易懂]

    Futex系统调用,Futex机制,及具体案例分析[通俗易懂]Futex1、背景1.1自己实现锁1.1.1自旋锁1.1.2sleep+自旋1.1.3小结1.2futex1.2.1什么是Futex1.2.2futex诞生之前1.2.3futex诞生之后2、Futex系统调用3、Futex机制4、具体案例分析4.1在Bionic中的实现4.2C语言实现5、参考及扩展阅读首先要区分一下futex系统调用和futex机制。futex系统调用是操作系统提供给上层的系统调用接口。而futex机制是使用futex接口实现的一种锁。1、背景线程同步可以说

    2022年9月21日
    2
  • 面试java工程师的自我介绍_软件开发和程序员一样吗

    面试java工程师的自我介绍_软件开发和程序员一样吗程序员面试时一段短短的自我介绍,其实是为了揭开更深入的面谈而设计的。下面学习啦小编为你带来java程序员面试自我介绍范文的内容,希望你们喜欢。关于java程序员面试自我介绍范文篇一本人叫小冰,今年22岁,现在是吉林大学软件开发与信息管理专业方向的三年级学生,对软件开发怀有浓烈的兴趣,且对JAVA语言尤其熟悉,能熟练使用jsp、struts、struts2、sring2和hibernate3等流行的…

    2025年6月28日
    5
  • [261]Connection reset by peer的常见原因及解决办法[通俗易懂]

    [261]Connection reset by peer的常见原因及解决办法[通俗易懂]1,如果一端的Socket被关闭(或主动关闭,或因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connectresetbypeer)。Socket默认连接60秒,60秒之内没有进行心跳交互,即读写数据,就会自动关闭连接。2,一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connectionreset)。简单的…

    2022年6月26日
    26

发表回复

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

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