多线程中需要返回值, java中有个fork/join模型, 没有细研究, 简单实用callable进行了返回

Thread1

package com.iwhere.easy.travel.test.thread;

import java.util.concurrent.Callable;

import org.springframework.web.client.RestTemplate;

import com.alibaba.fastjson.JSONObject;

public class Thread1 implements Callable<String>{

    @Override
public String call() throws Exception {
Thread.sleep();
System.out.println("thread1 sleep 5s");
new RestTemplate().getForObject("http://abc.2314", JSONObject.class);
return "i am thread one";
} }

Thread2

package com.iwhere.easy.travel.test.thread;

import java.util.concurrent.Callable;

public class Thread2 implements Callable<String>{

    @Override
public String call() throws Exception {
Thread.sleep();
System.out.println("thread2 sleep 2s"); if ( == ) throw new RuntimeException(); return "i am thread two";
} }

Thread3

package com.iwhere.easy.travel.test.thread;

import java.util.concurrent.Callable;

public class Thread3 implements Callable<String>{

    @Override
public String call() throws Exception {
Thread.sleep();
System.out.println("thread3 sleep 8s");
// Thread.currentThread().interrupt();
return "i am thread three";
} }

main类

package com.iwhere.easy.travel.test.thread;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; public class MyThreadTest { private static ExecutorService threadPool = Executors.newFixedThreadPool(); public static void main(String[] args) throws InterruptedException, ExecutionException { Thread1 thread1 = new Thread1();
Future<String> futureTask1 = threadPool.submit(thread1); Thread2 thread2 = new Thread2();
Future<String> futureTask2 = threadPool.submit(thread2); Thread3 thread3 = new Thread3();
Future<String> futureTask3 = threadPool.submit(thread3); String string1 = null;
String string2 = null;
String string3 = null; try {
string1 = futureTask1.get();
}catch (Exception e) {
futureTask1.cancel(true);
}
try {
string2 = futureTask2.get();
}catch (Exception e) {
futureTask2.cancel(true);
}
try {
string3 = futureTask3.get();
}catch (Exception e) {
futureTask3.cancel(true);
} // Thread.currentThread().wait(1000);
// futureTask1.cancel(true);
// futureTask2.cancel(true);
// futureTask3.cancel(true); System.out.println(string1 + ": " + string2 + ": " + string3); threadPool.shutdown();
}
}

这样在线程中抛出异常,仍然可以,

有一个问题仍然存在, 要是线程中莫名停止了, 就不会反回值 了..

java-多线程future等待返回的更多相关文章

  1. paip.java 多线程参数以及返回值Future FutureTask 的使用.

    paip.java 多线程参数以及返回值Future FutureTask 的使用. 在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果. 所以run的返回值是vo ...

  2. Java多线程Future模式

    Java多线程Future模式有些类似于Ajax的异步请求Future模式的核心在于:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑 假设服务器的处理某个业务,该业务可以分 ...

  3. java 多线程—— 线程等待与唤醒

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  4. java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)

     *java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时 ...

  5. Java 多线程 - Future

    Java中Future的使用场景和解析 https://blog.csdn.net/hongtaolong/article/details/83349705 (细看!!!)

  6. Java 多线程Future和FutureTask

    Future表示一个任务的周期,并提供了相应的方法来判断是否已经完成或者取消,以及获取任务的结果和取消任务. Future接口源码: public interface Future<V> ...

  7. java多线程Future和Callable类的解释与使用

    一,描写叙述 ​在多线程下编程的时候.大家可能会遇到一种需求,就是我想在我开启的线程都结束时,同一时候获取每一个线程中返回的数据然后再做统一处理,在这种需求下,Future与Callable的组合就派 ...

  8. java 多线程 Future callable

    面向对象5大设计原则 1.单一职责原则  一个类只包含它相关的方法,增删改查.一个方法只包含单一的功能,增加.一个类最多包含10个方法,一个方法最多50行,一个类最多500行.重复的代码进行封装,Do ...

  9. java多线程的等待唤醒机制及如何解决同步过程中的安全问题

    /* class Person{ String name; String sex; boolean flag = true; public void setPerson(String name, St ...

随机推荐

  1. redis开机自启动脚本(linux)

    目前redis放在home下的文件夹中,写一个脚本,待系统启动的过程中,去启动该脚本. 脚本:redis.sh #!/bin/sh /home/juepei/Downloads/redis-3.0.0 ...

  2. MVC4 项目开发日志(1)

    最近一直在定义一个功能全面,层次结构分明的框架.一边学习一边应用.

  3. MYC编译器源码之代码生成

    前面讲过语法的解析之后,代码生成方面就简单很多了.虽然myc是一个简单的示例编译器,但是它还是在解析的过程中生成了一个小的语法树,这个语法树将会用在生成exe可执行文件和il源码的过程中. 编译器在解 ...

  4. 如何使用linq读取DataTable集合?AsQueryable() 和 AsEnumerable()区别?

    一.准备工作 引入linq和data 相关的using命名空间 DataTable dt=new DataTable();//dt的来源可以是多个地方,比如:数据库,Excel等等.我这里使用Exce ...

  5. C# Po3协议读取邮件内容遇到的问题

    背景:最近在做一个小工具,读取PO3协议邮件服务器的指定人员的邮件,东西做出来了,弄了一个While死循环,20秒执行一次, 结果运行了3天,周一来IT人员找上门来了,你的电脑什么情况,怎么一个小时下 ...

  6. NET项目发布到IIS上报错:HTTP 错误 403.14

    NET项目发布到IIS上报错:HTTP 错误 404.0 - Not Found 原因:由于本机开发环境是Net4.5,所以虽然创建项目时选择的是net framework4.5的,但是webconf ...

  7. jzoj5945

    這題是均分紙牌求方案數 我們可以分2種情況討論: 1.當前面部分的平均值>=現在我們要的值 那麼我們可以把所有牌都放到第i個點,現在若有k張牌,則要把k−i∗avek-i*avek−i∗ave張 ...

  8. SVN图形客户端上传静态库.a文件失败

    1.原因客户端未添加静态库 2.解决办法 到项目静态库所在目录用命令行添加静态库文件 svn add ****.a 3.可能存在问题 Mac OS的自带SVN版本过低不能添加,报错如下: svn: E ...

  9. Python小白学习之路(十二)—【前向引用】【风湿理论】

    前向引用 风湿理论(函数即变量) 理论总是很抽象,我个人理解: 代码从上到下执行,一旦遇到定义的函数体,内存便为其开辟空间,并用该函数的名字作为一个标识但是该函数体内具体是什么内容,这个时候并不着急去 ...

  10. Python小白学习之路(八)—【变量】【基本数据类型分类】【集合】【集合的功能】

    一.变量 变量的作用:记录状态的变化变量的值:描述不同的状态 二.五大基本数据类型的分类 五大基本数据类型(数字 字符串 列表 元祖 字典) 按照可变不可变来进行分类 可变:列表.字典 不可变:字符串 ...