说起java的线程操作,都会想到Thread和Runable这两个, 这两个类可以实现异步和同步. 在大多数的java开发中, 这两个都是实现异步的线程来使用,

但是现在考虑一种情况: 发出一条线程, 但是得等待这条线程返回结果后, 我们再去发另一个线程. (读者肯定会想到用线程的同步机制做处理)

下面介绍Callable的使用, 也是最近一段时间才学到的新技能, 在这里记录一下。(我的理解就是: Callable是串联级别的线程)

简单介绍一下Callable:

1. Callable和Runnbale一样代表着任务,区别在于Callable有返回值并且可以抛出异常

2. Future是一个接口,代表了一个异步计算的结果(下面代码看什么是Future)。接口中的方法用来检查计算是否完成、等待完成和得到计算的结果。当计算完成后,只能通过get()方法得到结果,get方法会阻塞直到结果准备好了。如果想取消,那么调用cancel()方法。其他方法用于确定任务是正常完成还是取消了。一旦计算完成了,那么这个计算就不能被取消

package testJava;import java.io.DataOutputStream;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;public class CallableTest {final int ThreadPoolSize = 30;ExecutorService executorService;  // 在外面只要调用sendRequest()这个方法就可以了public boolean sendRequest() {boolean result =false;try {executorService = Executors.newFixedThreadPool(ThreadPoolSize);       // 这里就是调用Callable的使用方法, 用get得到返回的结果 Future tvFuture = executorService.submit(new TestCallable("192.168.0.11", 80));result = (boolean) tvFuture.get();        } catch (Exception e) {System.out.println(e.getMessage());}return result;}class TestCallable implements Callable {private String ip;private int port;public TestCallable(String ip, int port){this.ip = ip;this.port = port;}@Overridepublic Object call() throws Exception {// TODO Auto-generated method stubreturn testCall(ip, port);}        }private boolean testCall(String ip, int port) {boolean result = false;try {URL url = new URL("http://" + ip + ":" + port + "/WIXP");String data = "testData";HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("POST");connection.setConnectTimeout(20*1000);connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");connection.setRequestProperty("Content-Length", ""+ Integer.toString(data.getBytes().length));connection.setRequestProperty("Content-Language", "en-US");connection.setUseCaches(false);connection.setDoInput(true);connection.setDoOutput(true);try (DataOutputStream wr = new DataOutputStream(connection.getOutputStream());) {wr.writeBytes(data);wr.flush();} catch (ConnectException e) {System.out.println(e.getMessage());} catch (Exception e) {System.out.println(e.getMessage());}if (connection.getResponseCode() == 200) { result = true;}} catch (Exception e) {System.out.println(e.getMessage());}return result;}}

转载于:https://www.cnblogs.com/xumBlog/p/9499292.html

Callable的简单使用相关推荐

  1. java callable接口_Java Callable接口实现细节详解

    代码如下 import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import ja ...

  2. 多线程、线程池的创建方式,为什么阿里推荐自定义线程池?

    1.多线程的四种实现方式 * 多线程的实现方式有四种* 1.继承thread类* 2.实现runnable接口* 3.实现Callable* 实现Callable不能简单把Callable对象传给th ...

  3. Future和FutureTask实现异步计算

    开发Android APP经常会使用AsyncTask框架来异步加载资源或者异步到服务器拉消息,等任务完成后再主动更新结果到UI主线程,AsyncTask框架可以非常方便的获取线程异步执行结果.Jav ...

  4. 【Java学习】JUC并发编程

    目录 1.JUC是什么 1.1 JUC简介 1.2 线程和进程概念 1.2.1 进程和线程 1.3 线程的状态 1.3.1 线程状态枚举类 1.3.2 wait和sleep的区别 1.3.3 使用范围 ...

  5. java多线程高级:JUC

    文章目录 java多线程高级:JUC 1 多线程锁 1.1 传统synchronized 1.2 Lock接口 1.3 Synchronized和Lock的区别 2生产者和消费者问题 2.1 Sync ...

  6. 多线程进阶=》JUC并发编程

    多线程进阶=>JUC并发编程 1.什么是JUC ​ JUC是java.util.concurrent的简写. ​ 用中文概括一下,JUC的意思就是java并发编程工具包. ​ 并发编程的本质就是 ...

  7. JVM、JUC、网络、线程

    1. JVM 面试常见: 请你谈谈你对 JVM 的理解? java 8 虚拟机和之前的变化更新? 什么是 OOM,什么是栈溢出 StackOverFlowError? 怎么分析? JVM的常用调优参数 ...

  8. Callable与Future的简单介绍

    Callable与Future的介绍 Callable与 Future 两功能是Java在后续版本中为了适应多并法才加入的,Callable是类似于Runnable的接口,实现Callable接口的类 ...

  9. 简单理解Callable接口

    Callable接口: Callable,新启线程的一种方式,返回结果并且可能抛出异常的任务,在前面的新启线程的文章中用过,但是没有具体讲解 优点: 可以获取线程的执行结果,也称为返回值 通过与Fut ...

最新文章

  1. 如何在 1 秒内将 50 个 OpenCV 帧上传到云存储
  2. 我们是如何解决复杂系统扩展性问题的
  3. Java 类不可被继承的几种方法
  4. MobileNetV3
  5. 从一次线下读书会获得的收获
  6. Linux 中yum的配置
  7. 微信终于给我抛橄榄枝了,关于面试我又有话说
  8. Python学习 第3天 VS与PyCharm使用对比
  9. R语言统计分布及模拟
  10. A child container failed during start 解决方案
  11. 5G 会榨干手机的电池?
  12. 显式Intent 和隐式 Intent 的区别
  13. JavaScrip节点属性-访问子节点
  14. windows权限了解
  15. 联想笔记本键盘亮屏幕不亮_联想笔记本电脑开机键亮但是黑屏?键盘没反应?
  16. ST-Link驱动安装包 STM32 keil
  17. linux 常用查看日志命令--more 命令
  18. Vmware打开服务器的时候提示“该虚拟机似乎正在使用中。”
  19. Java POI 导出 Excel 单元格 合并单元格 相邻的相同值 合并
  20. 常用快递API及快递在线下单API分享

热门文章

  1. candy算子python_Python-计算机视觉中的Canny边缘检测方法
  2. Online Shopping网上商城数据库设计
  3. 使用Java处理除法运算的陷阱
  4. linux的同步与互斥
  5. C#之windows桌面软件第十三课:C#中常用的类有哪些?构造函数怎么用?
  6. RTOS之uCOS-II源码下载及源码目录结构、常见的RTOS!
  7. 常考数据结构与算法:找到字符串的最长无重复字符子串
  8. go语言初体验(流程控制、range遍历、函数、结构体、面向对象)
  9. Hexo+OSChina(码云)+git 搭建个人博客
  10. 基于rman 全备+归档在线搭建DG