zoukankan      html  css  js  c++  java
  • 【多线程】如何通过线程返回值?如何使用多线程并发查询数据

    使用Callable声明可返回值的线程

    使用Callable声明可返回值的线程:

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.util.concurrent.*;
    
    public class MyThreadA implements Callable<String> {
    
        private Logger logger = LoggerFactory.getLogger(this.getClass());
    
        @Override
        public String call() throws Exception {
            this.logger.info("开始执行MyThreadA");
            this.logger.info("假设耗时3秒");
            TimeUnit.SECONDS.sleep(3);
    
            return "data a";
        }
    
    }
    View Code

    如何并发执行线程

    紧接上一例子的Callable,我们多谢一个线程:

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.TimeUnit;
    
    public class MyThreadB implements Callable<String> {
    
        private Logger logger = LoggerFactory.getLogger(this.getClass());
    
        @Override
        public String call() throws Exception {
            this.logger.info("开始执行MyThreadB");
            this.logger.info("假设耗时5秒");
            TimeUnit.SECONDS.sleep(5);
    
            return "data b";
        }
    
    }
    View Code

    写一个测试类,并发调用两个线程:

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.util.concurrent.*;
    
    public class Test {
    
        private static Logger logger = LoggerFactory.getLogger(Test.class);
    
        public static void main(String[] args) throws Exception {
            ExecutorService es = Executors.newCachedThreadPool();
    
            Future<String> futureA = es.submit(new MyThreadA());
            Future<String> futureB = es.submit(new MyThreadB());
    
            String resultA = futureA.get();
            String resultB = futureB.get();
            logger.info("已获得全部结果,resultA:{},resultB:{}", resultA, resultB);
        }
    
    }
    View Code

    查看下列日志,可以发现,第一个线程所需3秒,第二个线程所需5秒,两个线程并发执行,即5秒完成:

    00:38:13.226 [pool-1-thread-1] INFO MyThreadA - 开始执行MyThreadA
    00:38:13.244 [pool-1-thread-1] INFO MyThreadA - 假设耗时3秒
    00:38:13.246 [pool-1-thread-2] INFO MyThreadB - 开始执行MyThreadB
    00:38:13.246 [pool-1-thread-2] INFO MyThreadB - 假设耗时5秒
    00:38:18.246 [main] INFO Test - 已获得全部结果,resultA:data a,resultB:data b

    参考API

    Callable<V>

    Future<V>

    ExecutorService.submit(java.util.concurrent.Callable)

    InterruptedException

    ExecutionException

  • 相关阅读:
    10.19JDBC之DBCP连接池的使用
    计时器Timer介绍
    Silverlight3.0 起步(一)——环境
    javascript 类
    RhinoMock入门(6)——安装结果和约束
    RhinoMock入门(4)——次序和委托
    javascript 表达式、括号、常用函数和jquery库怎么样实现的分析
    CSP加密服务(一)
    RhinoMock入门(5)——属性,方法和方法选项
    RhinoMock入门(7)——Do,With和Recordplayback
  • 原文地址:https://www.cnblogs.com/nick-huang/p/4743705.html
Copyright © 2011-2022 走看看