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

  • 相关阅读:
    趋势线突破有效的标志 武胜
    jira 试用license
    Jmeter使用指南
    linux c mysql 编程
    apache module 读取配置文件
    solr 中文分词 mmseg4j 使用例子 ,NGramTokenizerFactory
    使用CTabCtrl控件实现属性页功能
    linux 命令
    vc++2008 采用GSoap访问 WebService
    apr 编程demo出错。
  • 原文地址:https://www.cnblogs.com/nick-huang/p/4743705.html
Copyright © 2011-2022 走看看