zoukankan      html  css  js  c++  java
  • 怎么得到多线程的运算结果并处理

            最近参加了一个学校的程序设计比赛,为了解决运算速度使用了多线程,但是一个问题难倒我了,那就是怎么获取多线程的运算结果并作处理呢?查看的很多博客也没有得到满意的答案。


    目的:将多线程的运算结果存入线程安全的集合中

    一下几种方案我都没有成功,可能是我的使用有问题,如果有人看到感谢你们指出

    1.使用带有返回值的Callable和接收返回值的Future

        但是使用多个线程同时持有一个FutureTask进行运算

        线程池使用FutureTask时候需要注意的一点事


    	Callable<Map<Integer, String>> task = new Task(resultMap2);
    		FutureTask<Map<Integer, String>> future = new FutureTask<Map<Integer, String>>(
    				task);
    
    		int n = 10;
    		Thread[] threads = new Thread[n];
    		for (int i = 0; i < n; i++) {
    			threads[i] = new Thread(future);
    			// service.execute(threads[i]);
    			threads[i].start();
    		}
        失败


    2.使用join()方法,但是这样子线程并入主线程和单线程有什么区别

        失败


    3.使用CyclicBarrier

    ExecutorService service = Executors.newCachedThreadPool();
    		final CyclicBarrier cb = new CyclicBarrier(10, new Runnable() {
    			@Override
    			public void run() {
    				Set<Map.Entry<Integer, String>> entry = resultMap2.entrySet();
    				Iterator<Map.Entry<Integer, String>> iterator = entry
    						.iterator();
    				while (iterator.hasNext()) {
    					Map.Entry<Integer, String> en = iterator.next();
    					System.out.println(en.getKey());
    					System.out.println(en.getValue());
    				}
    			}
    		});

    设置每10个线程处理一次结果,但是这样的话储存运算结果的集合就会以直被处理结果的Runnable占用

        失败


    4.某日突然灵光一闪

    使用while(flag)一直使主线程不结束

    while (flag) {
    			while (lists.size() == read.filePathsList.size()) {
    				//排序
    				Collections.sort(lists, new ListListSortComparator(0, "asc"){});
    				CreatExcel.creatExcel(lists, titles, "xlsx", "企业信息表").write(os);
    				os.close();
    				long millis2 = System.currentTimeMillis();
    				System.out.println("(millis2 - millis1)---结束-------->"
    						+ (millis2 - millis1));
    
    				flag = false;
    				break;
    			}
    		}

        在所有的结果运算结束后flag=flase

        成功

  • 相关阅读:
    浏览器HTTP缓存原理分析
    基本概念复习
    什么是IOC为什么要使用IOC
    AutoFac记录
    NHibernate之旅(21):探索对象状态
    如何获取类或属性的自定义特性(Attribute)
    a different object with the same identifier value was already associated with the session
    6 CLR实例构造器
    6 CLR静态构造器
    CLR via C# 提纲
  • 原文地址:https://www.cnblogs.com/wei1/p/9582115.html
Copyright © 2011-2022 走看看