zoukankan      html  css  js  c++  java
  • Callable的简单使用

    说起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; } @Override public Object call() throws Exception { // TODO Auto-generated method stub return 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; } }
  • 相关阅读:
    vue+filesaver+xlsx导出table为excel
    layer弹窗第一次不居中。然后再点击就居中了。解决办法
    GitHub的Fork 是什么意思
    什么时候会发送options请求
    实现H5连接分享给好友或朋友圈自定义分享内容(标题、图片、简介)的方法代码
    vue的element的table表头自定义添加按钮
    小程序配置体验版添加参数
    迅为iMX8M Mini开发板硬件接口原理分析
    迅为i.MX8MM 核心板引脚说明(按功能划分)
    迅为3399开发板Ubuntu 系统双屏异显,双屏同显测试
  • 原文地址:https://www.cnblogs.com/xumBlog/p/9499292.html
Copyright © 2011-2022 走看看