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

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

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

简单介绍一下Callable:

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

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

  1. package testJava;
  2.  
  3. import java.io.DataOutputStream;
  4. import java.net.ConnectException;
  5. import java.net.HttpURLConnection;
  6. import java.net.URL;
  7. import java.util.concurrent.Callable;
  8. import java.util.concurrent.ExecutorService;
  9. import java.util.concurrent.Executors;
  10. import java.util.concurrent.Future;
  11.  
  12. public class CallableTest {
  13.  
  14. final int ThreadPoolSize = 30;
  15. ExecutorService executorService;

  16.   // 在外面只要调用sendRequest()这个方法就可以了
  17. public boolean sendRequest() {
  18. boolean result =false;
  19. try {
  20. executorService = Executors.newFixedThreadPool(ThreadPoolSize);
           // 这里就是调用Callable的使用方法, 用get得到返回的结果
  21. Future tvFuture = executorService.submit(new TestCallable("192.168.0.11", 80));
  22. result = (boolean) tvFuture.get();
  23. } catch (Exception e) {
  24. System.out.println(e.getMessage());
  25. }
  26. return result;
  27. }
  28.  
  29. class TestCallable implements Callable {
  30. private String ip;
  31. private int port;
  32.  
  33. public TestCallable(String ip, int port){
  34. this.ip = ip;
  35. this.port = port;
  36. }
  37.  
  38. @Override
  39. public Object call() throws Exception {
  40. // TODO Auto-generated method stub
  41. return testCall(ip, port);
  42. }
  43. }
  44.  
  45. private boolean testCall(String ip, int port) {
  46. boolean result = false;
  47.  
  48. try {
  49. URL url = new URL("http://" + ip + ":" + port + "/WIXP");
  50. String data = "testData";
  51. HttpURLConnection connection = (HttpURLConnection) url
  52. .openConnection();
  53. connection.setRequestMethod("POST");
  54. connection.setConnectTimeout(20*1000);
  55. connection.setRequestProperty("Content-Type",
  56. "application/x-www-form-urlencoded");
  57. connection.setRequestProperty("Content-Length", ""
  58. + Integer.toString(data.getBytes().length));
  59. connection.setRequestProperty("Content-Language", "en-US");
  60. connection.setUseCaches(false);
  61. connection.setDoInput(true);
  62. connection.setDoOutput(true);
  63.  
  64. try (DataOutputStream wr = new DataOutputStream(connection
  65. .getOutputStream());) {
  66. wr.writeBytes(data);
  67. wr.flush();
  68. } catch (ConnectException e) {
  69. System.out.println(e.getMessage());
  70. } catch (Exception e) {
  71. System.out.println(e.getMessage());
  72. }
  73.  
  74. if (connection.getResponseCode() == 200) {
  75. result = true;
  76. }
  77. } catch (Exception e) {
  78. System.out.println(e.getMessage());
  79. }
  80.  
  81. return result;
  82. }
  83.  
  84. }

Callable的简单使用的更多相关文章

  1. Runnable 和 Callable的区别

    Runnable 与 Callable的区别: (1)Callable规定的方法是call(),Runnable规定的方法是run(). (2)Callable的任务执行后可返回值,而Runnable ...

  2. 小白挑战:AsyncTask源码分析

    //AsyncTask从本质上讲,是对ThreadPool和handler的封装. 在学习线程池相关的知识时,看到书中提到AsyncTask的实现中使用到了ThreadPool,于是把源码翻了出来, ...

  3. 在 tornado 中异步无阻塞的执行耗时任务

    在 tornado 中异步无阻塞的执行耗时任务 在 linux 上 tornado 是基于 epoll 的事件驱动框架,在网络事件上是无阻塞的.但是因为 tornado 自身是单线程的,所以如果我们在 ...

  4. Tornado异步阻塞解决方案

    在 tornado 中异步无阻塞的执行耗时任务 在 linux 上 tornado 是基于 epoll 的事件驱动框架,在网络事件上是无阻塞的.但是因为 tornado 自身是单线程的,所以如果我们在 ...

  5. 【Java并发】Executor框架

      Executor框架简介 Java的线程既是工作单元,也是执行机制.从JDK5开始,把工作单元和执行机制分离开来. Executor框架由3大部分组成 任务. 被执行任务需要实现的接口:Runna ...

  6. the reactor pattern and java nio

    在<java NIO>作者PPT<How to Build a Scalable Multiplexed Server With NIO> 和 Doug Lea <Sca ...

  7. Java多线程之以7种方式让主线程等待子线程结束

    记一次主线程等待子线程结束的多种方法的学习 在学习多线程时,最开始遇到的问题其实是"计算子线程运行时间",写到最后发现本文和标题更为符合,但是仍然基于问题:"在主线程中获 ...

  8. Java异步之《我call(),Future在哪里》

    我们大家都知道,在 Java 中创建线程主要有三种方式: 继承 Thread 类: 实现 Runnable 接口: 实现 Callable 接口. 而后两者的区别在于 Callable 接口中的 ca ...

  9. 多线程JUC并发篇常见面试详解

    @ 目录 1.JUC 简介 2.线程和进程 3.并非与并行 4.线程的状态 5.wait/sleep的区别 6.Lock 锁(重点) 1.Lock锁 2.公平非公平: 3.ReentrantLock ...

随机推荐

  1. tensorflow session会话控制

    import tensorflow as tf # create two matrixes matrix1 = tf.constant([[3,3]]) matrix2 = tf.constant([ ...

  2. Spring入门第二十四课

    Spring对JDBC的支持 直接看代码: db.properties jdbc.user=root jdbc.password=logan123 jdbc.driverClass=com.mysql ...

  3. 1.5 xss漏洞修复

    1.XSS漏洞修复 从上面XSS实例以及之前文章的介绍我们知道XSS漏洞的起因就是没有对用户提交的数据进行严格的过滤处理.因此在思考解决XSS漏洞的时候,我们应该重点把握如何才能更好的将用户提交的数据 ...

  4. laravel 导出插件

    转发:https://blog.csdn.net/gu_wen_jie/article/details/79296470 版本:laravel5 php 5.6 安装步骤: 一.安装插件 ①.首先在L ...

  5. Spring基本原理模拟(IoC部分)

    package ioc; import java.io.File; import java.lang.reflect.Method; import java.util.Collections; imp ...

  6. UML——初识

    初识 刚刚接触到UML的时候,先看的书,对整本书的内容做了宏观的把控.感觉UML这个东西和自己想象中的不一样.起初我认为它只是一个工具,将软件开发过程中不同的阶段用不用种类的图表现出来,后来才发现它是 ...

  7. IO模式和IO多路复用详解

    网络编程里常听到阻塞IO.非阻塞IO.同步IO.异步IO等概念,总听别人装13不如自己下来钻研一下.不过,搞清楚这些概念之前,还得先回顾一些基础的概念. 1 基础知识回顾 注意:咱们下面说的都是Lin ...

  8. CF446A DZY Loves Sequences 简单dp

    DZY has a sequence a, consisting of n integers. We'll call a sequence ai, ai + 1, ..., aj (1 ≤ i ≤ j ...

  9. PHP下载远程图片的几种方法总结

    1. 使用file_get_contents function dlfile($file_url, $save_to) { $content = file_get_contents($file_url ...

  10. 利用Python的smtplib和email发送邮件

    原理 网上已经有了很多的教程讲解相关的发送邮件的原理,在这里还是推荐一下廖雪峰老师的Python教程,讲解通俗易懂.简要来说,SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本 ...