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;
}
}

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Linux常用命令:chmod修改文件权限 777和754

    Linux常用命令:chmod修改文件权限 777和754常用下面这条命令:chmod777 文件或目录示例:chmod 777/etc/squid运行命令后,squid文件夹(目录)的权限就被修改为777(可读可写可执行)。如果是Ubuntu系统,可能需要加上sudo来执行:sudochmod 777/etc/squid故事的开始,都会先留一个悬念。只有程序员能懂的冷笑话系列中,有个比较经典的段子:请用最简洁的语言描述我国FL。754。…

  • 多种前端框架的优缺点「建议收藏」

    多种前端框架的优缺点「建议收藏」多种前端框架的优缺点

  • c++ 分苹果_接苹果问题C语言

    c++ 分苹果_接苹果问题C语言#include<iostream>usingnamespacestd;intfun(intm,intn){if(m==0)return1;if(n==1)return1;if(m<n)returnfun(m,m);//最大的情况就是m个苹果放在m个盘子里面if(m>=n)retur…

    2022年10月12日
  • mysql有casewhen函数吗_case when mysql

    mysql有casewhen函数吗_case when mysql本文主要向大家介绍了MySQL数据库之Mysqlcasewhen的三种用法,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。<casewhen的三种用法:1.case字段when,字段的具体值。selecta.*,casenamewhen’流浪’then’法师’else’战士’endas’类型’FROMc_20170920a2.cas…

  • 用java web实现聊天室_java web实现简单聊天室「建议收藏」

    用java web实现聊天室_java web实现简单聊天室「建议收藏」目标servlet、jsp实现简单聊天室,用户通过浏览器登录后进入聊天室,可发送消息进行群聊,点击聊天信息框中的用户名可实现拍一拍功能。基础知识数据的存取setAttribute/getAttributerequest请求对象:有效时间短ServletContext上下文对象:一直存在于服务器,存储公有、共享数据Session会话对象:独立网站默认页面一般是index.jsp实现思路1….

  • python中的if语句格式_python if判断

    python中的if语句格式_python if判断if判断语句if判断语句介绍if语句是用来进行判断的,其使用格式如下:if要判断的条件:条件成立时,要做的事情demo1:age=30print”——if判断开始——“ifage>=18:print”我已经成年了”print”——if判断结束——“

发表回复

您的电子邮箱地址不会被公开。

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