java 多线程Callable和Runable执行顺序问题详解
详见: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执行顺序问题详解相关推荐
- java的for的执行顺序_对java for 循环执行顺序的详解
如下所示: for(表达式1;表达式2;表达式3) { //循环体 } 先执行"表达式1",再进行"表达式2"的判断,判断为真则执行 "循环体&quo ...
- oracle select执行顺序,oracle select执行顺序的详解
oracle select执行顺序的详解 SQL Select语句完整的执行顺序:1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子 ...
- python实例化是什么意思_Python中实例化class的执行顺序示例详解
前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的顺序 一般来说一个类里面有类变量和方法,比如我们定 ...
- pythonclass实例化_Python中实例化class的执行顺序示例详解
原博文 2020-01-12 22:04 − 前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的顺序 ...
- python类中方法的执行顺序-Python中实例化class的执行顺序示例详解
前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的顺序 一般来说一个类里面有类变量和方法,比如我们定 ...
- Java多线程学习之wait、notify/notifyAll 详解
点击"终码一生",关注,置顶公众号 每日技术干货,第一时间送达! 1.wait().notify/notifyAll() 方法是Object的本地final方法,无法被重写. 2. ...
- java调用kettle连hive_使用java连接hive,并执行hive语句详解
安装hadoop 和 hive我就不多说了,网上太多文章 自己看去 首先,在机器上打开hiveservice hive --service hiveserver -p 50000 & 打开50 ...
- java hive 查询语句,使用java连接hive,并执行hive语句详解
packageasia.wildfire.hive.service; importjava.sql.*; importjava.sql.Date; importjava.text.SimpleDate ...
- java 远程shell脚本_java通过ssh连接服务器执行shell命令详解及实例
java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转 ...
最新文章
- java file 其他电脑上,java - Jar文件无法在另一台PC上执行
- 自定义注解妙用,一行代码搞定用户操作日志记录,你学会了吗?
- java队列怎么实现线程_Java中利用线程和队列实现入库操作
- 给Android Studio设置代码字体大小与界面字体样式
- stm32-串口接受不定长数据方法(3种)
- nivicat复制mysql数据库[Err] [Dtf] 1273 - Unknown collation: 'utf8mb4_0900_ai_ci'错误
- For与Function进阶实战、Lazy的使用笔记总结
- 计算机专业人大学排名,计算机专业学校排名哪些大学计算机专业比较好
- list筛选数据_Power Query如何对于各类混合格式的数据展开?
- mysql 5.7 双主配置_MySQL5.7.18 双主配置
- We want to do better without being distracted
- Leetcode 218.天际线问题
- centos5.5+NAT+Squid透明代理总结
- 用TestComplete实现一个关键字驱动测试框架
- 什么是少儿Python编程?
- 安徽二本大学计算机排名,2018安徽大学排名 安徽有哪些大学
- 【数据结构】给定中序序列,有多少种前序序列
- SpringBoot日记本系统全程直播09:项目一期完结
- vue项目中-打印页面中部分区域的内容
- 第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛H