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

  • 相关阅读:
    EOS概念理解总结
    boost asio one client one thread
    EOS 数据签名与公匙验证代码用例
    EOS 智能合约编写(一)
    EOS多节点同步代码分析
    EOS 用户权限相关命令
    EOS 多主机多节点配置终极命令
    EOS多主机多节点环境配置
    ubuntu命令错误集
    java多线程中的调度策略
  • 原文地址:https://www.cnblogs.com/nick-huang/p/4743705.html
Copyright © 2011-2022 走看看