• 【多线程】如何通过线程返回值?如何使用多线程并发查询数据


    使用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

  • 相关阅读:
    我决定重新开始搞机器学习啦
    基于问句实体扩展和全局规划的答案摘要方法研究相关论文
    cjson源代码解读(三) 解析字符串、数字、数组、对象
    论文阅读:DeepWalk
    cjson源代码解读 (二)解析流程
    cjson源代码解读 (一)介绍
    DDoS攻击的几种类型
    Nmap扫描二级目录
    一次域环境的渗透
    利用enum4linux 445端口+wordpress插件任意文件上传的一次渗透
  • 原文地址:https://www.cnblogs.com/nick-huang/p/4743705.html
Copyright © 2020-2023  润新知