0 0

Future在并发中带回结果。0

Iterator<Entry<String, List<HostIPModifyVo>>> iter = hostIPModifysMap.entrySet().iterator();
        while (iter.hasNext())
        {
            Entry<String, List<HostIPModifyVo>> entry = iter.next();
            List<HostIPModifyVo> singVMHostIPModifys = entry.getValue();
            PrepareHostIPModifyThread prepareHostIPModifyThread = new PrepareHostIPModifyThread(
                    this, singVMHostIPModifys);
            prepareHostIPModifyThread.setDmuConfigService(dmuConfigService);
            Future<?> future = threadManager.submit(prepareHostIPModifyThread);
            futures.add(future);
            
        }

 我构建多个线程并行运行,现在的问题是:如果其中一个线程处理出现问题或不是我预期的结果,那么程序的业务逻辑就不在进行下一步的处理。

 

请问我该如何做?


问题补充:我这里主要不是强调线程的同步问题。
举个应用场景:
我有3台机器需要安装oracle。客户要求分阶段执行。
1.传送安装包
2.检查安装环境
3.安装oracle
4.安装后处理
比如传送安装包过程中,其中有一个机器出现问题,那么任务就不能进入下一步(下面的阶段类似)。
我现在的做法是遍历3台机器,创建三个线程并发向三台机器传送安装包(代码类似问题中贴出的),如果传送过程中,其中一台机器出错,那么所有机器就不能进入下一阶段,任务失败。现在的问题是我怎么知道那个线程失败呢?
2014年9月11日 19:03

5个答案 按时间排序 按投票排序

0 0

任务实现 Callable接口比较好,包含返回值,也能抛出异常。
可以用Future去拿结果时检查是否出错。

2014年9月19日 21:22
0 0

这类 问题 在 《Java并发编程实践》中讨论过。

解决方法是将 任务提交和 结果接收解离,使用一个并发库里Queue来保存执行完成的Future


BlockingQueue<Future<?>> taskQueue = new BlockingQueue<Future<?>>();
Iterator<Entry<String, List<HostIPModifyVo>>> iter = hostIPModifysMap.entrySet().iterator();  
        while (iter.hasNext())  
        {  
            Entry<String, List<HostIPModifyVo>> entry = iter.next();  
            List<HostIPModifyVo> singVMHostIPModifys = entry.getValue();  
            PrepareHostIPModifyThread prepareHostIPModifyThread = new PrepareHostIPModifyThread(  
                    this, singVMHostIPModifys, taskQueue);  
            prepareHostIPModifyThread.setDmuConfigService(dmuConfigService);  
            threadManager.submit(prepareHostIPModifyThread);  
        }  
int finishedCount = 0;
while(true) {
  Future<?> finished = taskQueue.take();
  //  TODO do something with finished task
  finishedCount++;
  if (finishedCount>=hostIPModifysMap.size()) {
    break;
  }
}

2014年9月15日 09:58
0 0

for(Future f :futures){
 try{
 Object returnValue = f.get();
}catch(Exception e){
 //execute exception happened
}
}

2014年9月12日 13:23
0 0

这个是同步调用。看调用的返回值走不一样的代码就可以了。

2014年9月11日 21:54
0 0

线程同步问题,用CountDownLatch,工作线程countDown(),主线程await()阻塞,工作线程全部结束再处理下一步

2014年9月11日 21:31

相关推荐

    java多线程并发

    在现代软件开发中,特别是在Java这样的主流编程语言中,多线程并发技术是提高程序执行效率、优化资源利用的关键手段之一。本篇文章将深入探讨Java中的多线程并发机制,并通过具体的示例来帮助读者更好地理解和掌握这...

    实战java高并发程序设计 分章 高清 带作业

    这本书深入浅出地讲解了如何在Java环境中有效地处理高并发问题,为读者提供了丰富的实战经验和技巧。 首先,Java并发编程是Java开发中的重要领域,尤其在大型互联网应用、分布式系统和云计算中,高并发处理能力是...

    boost实现的小型网络框架

    在异步编程模型中,Boost.Asio通过回调函数或future/promise机制来通知程序何时可以处理完成的I/O操作。这种模式特别适合于处理大量并发连接,因为它避免了线程阻塞,减少了线程上下文切换的开销,提升了整体性能。 ...

    jee6 学习笔记 6.3 - @Asynchronous

    当一个带有`@Asynchronous`的方法被调用时,调用者会立即返回,而实际的方法执行将在另一个线程中进行,返回的是一个Future对象,通过该对象可以在适当的时候查询或等待方法的执行结果。 3. **使用示例**: ```...

    javafuture源码-demo-java-completablefuture:“带有CompletableFuture的Java异步编程”

    Future接口在构建非平凡的异步计算时有很大的局限性: 无法为将来的比赛注册回叫 不可能以非阻塞的方式传递期货 不可能手动完成未来 为了克服这些限制,Java 8添加(并更新了Java 9和Java 12) CompletionStage接口...

    Java多线程设计模式(附带书中源码)

    多线程是并发编程的基础,尤其在现代计算环境中,充分利用多核处理器的能力,提高应用程序的响应速度和吞吐量。本资料包含了与Java多线程设计模式相关的书籍源码,将帮助开发者深入理解并熟练应用这些模式。 1. **...

    netty in action 中文PDF 带目录

    2. **回调与 Future**:Netty 中的回调和 Future 能够帮助开发者处理异步编程中结果的获取与处理。 3. **非阻塞IO**:Netty 使用非阻塞IO,这区别于传统的阻塞IO,能大幅提高应用程序性能。 4. **跨平台兼容性**:...

    java-concurrent:Java并发

    `Future`接口代表异步计算的结果,而`Callable`接口定义了一个带返回值的任务。它们与`ExecutorService`结合使用,可以实现异步计算和结果获取。 6. **原子类** `java.util.concurrent.atomic`包包含了一系列原子...

    多线程异步调用(并参递参数)

    在单线程环境中,程序执行是顺序的,一次只能做一件事。而在多线程环境中,程序可以同时执行多个任务,每个任务称为一个线程。线程之间共享同一块内存空间,但各自拥有独立的执行流程。这样可以使得CPU在不同任务间...

    Android下用线程池实现Http下载程序

    `Callable`用于创建一个带返回值的任务,而`Future`则用来获取任务的执行结果,包括获取结果、检查是否完成以及取消任务等操作。 5. **异步下载**:通过线程池实现的下载是异步的,这意味着主线程不会被阻塞,用户...

    CompletableFuture 异步处理

    在这个例子中,主线程不会阻塞,而是立即返回并继续执行其他代码,直到CompletableFuture的结果准备好,然后通过`thenAccept`方法提供的回调函数处理结果。 【同步与异步、阻塞与非阻塞的区别】 同步和异步关注的...

    异步 同步 阻塞 非阻塞 的说明1

    在IT领域,尤其是在多线程和并发编程中,同步、异步、阻塞和非阻塞是四个非常关键的概念。这些概念通常与操作系统、网络I/O、数据库操作以及Java等编程语言中的线程管理紧密相关。现在让我们逐一深入探讨它们的含义...

    批量上传文件带进度条

    "批量上传文件带进度条"的实现是通过提供一个工具类,使得开发者能够方便地在应用中集成这一功能,同时给予用户友好的上传进度反馈。在这一过程中,涉及的技术点主要包括多线程、文件切片、异步处理、进度监听和UI...

    dubbo第四节1

    调用方发起请求后不会立即等待响应,而是立即返回一个 Future 对象,调用者可以在后续某个时间点通过 Future 获取结果。 2. **事件机制 - 异步回调**:Dubbo 提供了事件机制来支持异步回调,当服务端完成处理后,...

    springboot中@Async异步调用注解的使用

    在Spring Boot框架中,@Async注解是实现异步任务处理的关键工具,它允许开发者将耗时的操作从主线程中分离出来,以提高应用程序的响应速度。本文将深入探讨@Async的工作原理、配置方法以及使用场景,帮助你更好地...

    Java 5_0 多线程编程实践

    - 在Java 5.0中,`Callable`接口允许我们定义带有返回值的任务,而`Future`接口则用于获取这些任务的结果。这种模式非常适合那些需要长时间运行且可能在将来某个时间点才被访问结果的任务。 ```java ...

    Akka Essentials code

    异步处理在Akka中至关重要,它通过Future和Promise对象实现,允许代码在不等待结果的情况下继续执行,提高了系统的吞吐量。代码示例将展示如何使用这些工具进行异步编程,并处理回调和组合异步操作。 Akka还提供了...

    AsynTest.7z

    如果需要返回结果,可以使用`Future`或者回调机制。 此外,Spring提供了自定义异步执行器(Executor)的能力。通过在配置类中使用`@ConfigurationProperties`和`ThreadPoolTaskExecutor`,我们可以配置线程池的大小...

    学习《Netty实战》过程中使用到的案例.zip

    《Netty实战》是一本深度解析Netty框架的书籍,Netty是Java平台上的一款高性能、异步事件驱动的网络应用程序框架,广泛应用于高并发、低延迟的系统开发中,如服务器端应用、分布式系统、实时通信等场景。在这个...

    执行异步操作并显示操作进度.rar

    在IT领域,异步操作是现代应用程序开发中的关键概念,特别是在多线程和并发环境中的Web应用、桌面应用以及移动应用。异步操作允许程序在等待某个耗时操作完成的同时,继续处理其他任务,从而提高应用程序的响应性和...

Global site tag (gtag.js) - Google Analytics