详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt125

毫无疑问 Runnable会进行异步执行,此处不多说,主要说明Callable的使用,看实例:

1、

1
2
3
4
5
6
7
8
9
10
11
public class ThreadTest {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService executor = Executors.newFixedThreadPool(4);
        MyTread m1 = new MyTread();
        Future f = executor.submit(m1);
        // System.out.println(f.get());
        executor.shutdown();
        System.out.println("主线程执行完了");
    }
  
}

1
2
3
4
5
6
7
8
9
10
11
12
13
  
class MyTread implements Callable<String> {
    @Override
    public String call() {
        try {
            System.out.println("线程调度:" + Thread.currentThread());
            TimeUnit.SECONDS.sleep(3);
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "123";
    }
}

此程序虽然获取了call方法的返回值,但是没有做处理,所以主线程main和m1同时执行,执行结果如下:

主线程执行完了

线程调度:Thread[pool-1-thread-1,5,main]

2、

1
2
3
4
5
6
7
8
9
10
11
public class ThreadTest {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService executor = Executors.newFixedThreadPool(4);
        MyTread m1 = new MyTread();
        Future f = executor.submit(m1);
        System.out.println(f.get()); // 进行了输出
        executor.shutdown();
        System.out.println("主线程执行完了");
    }
  
}

1
2
3
4
5
6
7
8
9
10
11
12
class MyTread implements Callable<String> {
    @Override
    public String call() {
        try {
            System.out.println("线程调度:" + Thread.currentThread());
            TimeUnit.SECONDS.sleep(3);
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "123";
    }
}

在2中,对m1中call方法的返回值在main中进行了处理(输出),所以在此种情况下,main需要等待m1执行完,再继续执行,执行结果如下

线程调度:Thread[pool-1-thread-1,5,main]

123

主线程执行完了

3、再看当主线程中同时启动两个由Callable生成的线程时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ThreadTest {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService executor = Executors.newFixedThreadPool(4);
        MyTread m1 = new MyTread();
        MyTread2 m2 = new MyTread2();
        Long time1 = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis());
        Future f = executor.submit(m1);
        Future f2 = executor.submit(m2);
        System.out.println(f.get()); // 进行了输出m1
        System.out.println(f2.get()); // 进行了输出m2
        executor.shutdown();
        System.out.println("主线程执行完了");
        Long time2 = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis());
        System.out.println("主线程等待了" + (time2 - time1) + "秒");
    }
  
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class MyTread implements Callable<String> {
    @Override
    public String call() {
        try {
            System.out.println("线程调度:" + Thread.currentThread());
            TimeUnit.SECONDS.sleep(3);
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "123";
    }
}
  
class MyTread2 implements Callable<String> {
    @Override
    public String call() {
        try {
            System.out.println("线程调度2:" + Thread.currentThread());
            TimeUnit.SECONDS.sleep(3);
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "abc";
    }
}

当不对m1和m2做输出时,main和m1、m2并发执行,当对m1和m2中任意一个的返回值进行处理的时候,main需要等待,但是m1和m2之前仍然是并发执行,执行结果如下:

线程调度2:Thread[pool-1-thread-2,5,main]

线程调度:Thread[pool-1-thread-1,5,main]

123

abc

主线程执行完了

主线程等待了3秒

java 多线程Callable和Runable执行顺序问题详解相关推荐

  1. java的for的执行顺序_对java for 循环执行顺序的详解

    如下所示: for(表达式1;表达式2;表达式3) { //循环体 } 先执行"表达式1",再进行"表达式2"的判断,判断为真则执行 "循环体&quo ...

  2. oracle select执行顺序,oracle select执行顺序的详解

    oracle select执行顺序的详解 SQL Select语句完整的执行顺序:1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子 ...

  3. python实例化是什么意思_Python中实例化class的执行顺序示例详解

    前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的顺序 一般来说一个类里面有类变量和方法,比如我们定 ...

  4. pythonclass实例化_Python中实例化class的执行顺序示例详解

    原博文 2020-01-12 22:04 − 前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的顺序 ...

  5. python类中方法的执行顺序-Python中实例化class的执行顺序示例详解

    前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的顺序 一般来说一个类里面有类变量和方法,比如我们定 ...

  6. Java多线程学习之wait、notify/notifyAll 详解

    点击"终码一生",关注,置顶公众号 每日技术干货,第一时间送达! 1.wait().notify/notifyAll() 方法是Object的本地final方法,无法被重写. 2. ...

  7. java调用kettle连hive_使用java连接hive,并执行hive语句详解

    安装hadoop 和 hive我就不多说了,网上太多文章 自己看去 首先,在机器上打开hiveservice hive --service hiveserver -p 50000 & 打开50 ...

  8. java hive 查询语句,使用java连接hive,并执行hive语句详解

    packageasia.wildfire.hive.service; importjava.sql.*; importjava.sql.Date; importjava.text.SimpleDate ...

  9. java 远程shell脚本_java通过ssh连接服务器执行shell命令详解及实例

    java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转 ...

最新文章

  1. java file 其他电脑上,java - Jar文件无法在另一台PC上执行
  2. 自定义注解妙用,一行代码搞定用户操作日志记录,你学会了吗?
  3. java队列怎么实现线程_Java中利用线程和队列实现入库操作
  4. 给Android Studio设置代码字体大小与界面字体样式
  5. stm32-串口接受不定长数据方法(3种)
  6. nivicat复制mysql数据库[Err] [Dtf] 1273 - Unknown collation: 'utf8mb4_0900_ai_ci'错误
  7. For与Function进阶实战、Lazy的使用笔记总结
  8. 计算机专业人大学排名,计算机专业学校排名哪些大学计算机专业比较好
  9. list筛选数据_Power Query如何对于各类混合格式的数据展开?
  10. mysql 5.7 双主配置_MySQL5.7.18 双主配置
  11. We want to do better without being distracted
  12. Leetcode 218.天际线问题
  13. centos5.5+NAT+Squid透明代理总结
  14. 用TestComplete实现一个关键字驱动测试框架
  15. 什么是少儿Python编程?
  16. 安徽二本大学计算机排名,2018安徽大学排名 安徽有哪些大学
  17. 【数据结构】给定中序序列,有多少种前序序列
  18. SpringBoot日记本系统全程直播09:项目一期完结
  19. vue项目中-打印页面中部分区域的内容
  20. 第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛H

热门文章

  1. jquery自动补全
  2. 多表操作,常用非常用字段
  3. 大型互联网公司必考java面试题与面试技巧
  4. 一对多查询,合并成一条数据
  5. apache起步命令加-k参数和不加的区别
  6. Leetcode 166. Fraction to Recurring Decimal
  7. UltraEdit正则表达式介绍及实例
  8. 如何使用Quagga,将你的CentOS设备变成OSPF路由器
  9. WCF分布式开发步步为赢(15):错误契约(FaultContract)与异常处理(ExceptionHandle)
  10. python 删除字符串中空格