Java_如何等待子线程执行结束
|
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
</div>public class Threads {public static void main(String[] args) {SubThread thread = new SubThread();thread.start();//主线程处理其他工作,让子线程异步去执行.mainThreadOtherWork();System.out.println("now waiting sub thread done.");//主线程其他工作完毕,等待子线程的结束, 调用join系列的方法即可(可以设置超时时间)try {thread.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("now all done.");}private static void mainThreadOtherWork() {System.out.println("main thread work start");try {Thread.sleep(3000L);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("main thread work done.");}public static class SubThread extends Thread{@Overridepublic void run() {working();}private void working() {System.out.println("sub thread start working.");busy();System.out.println("sub thread stop working.");}private void busy() {try {sleep(5000L);} catch (InterruptedException e) {e.printStackTrace();}}}} |
- main thread work start
- sub thread start working.
- main thread work done.
- now waiting sub thread done.
- sub thread stop working.
- now all done.
|
1
2
3
|
public final void join() throws InterruptedException {join(0);} |
public final synchronized void join(long millis)
|
1
2
3
|
while (isAlive()) {wait(0);} |
Tests if this thread is alive. A thread is alive if it has been started and has not yet died.
|
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
public class Threads {static ExecutorService executorService = Executors.newFixedThreadPool(1);@SuppressWarnings("rawtypes")public static void main(String[] args) throws InterruptedException, ExecutionException {SubThread thread = new SubThread();// thread.start();Future future = executorService.submit(thread);mainThreadOtherWork();System.out.println("now waiting sub thread done.");future.get();// try {// thread.join();// } catch (InterruptedException e) {// e.printStackTrace();// }System.out.println("now all done.");executorService.shutdown();}private static void mainThreadOtherWork() {System.out.println("main thread work start");try {Thread.sleep(3000L);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("main thread work done.");}public static class SubThread extends Thread{@Overridepublic void run() {working();}private void working() {System.out.println("sub thread start working.");busy();System.out.println("sub thread stop working.");}private void busy() {try {sleep(5000L);} catch (InterruptedException e) {e.printStackTrace();}}}} |
|
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
public class Threads {// static ExecutorService executorService = Executors.newFixedThreadPool(1);static final BlockingQueue queue = new ArrayBlockingQueue(1);public static void main(String[] args) throws InterruptedException, ExecutionException {SubThread thread = new SubThread(queue);thread.start();// Future future = executorService.submit(thread);mainThreadOtherWork();System.out.println("now waiting sub thread done.");// future.get();queue.take();// try {// thread.join();// } catch (InterruptedException e) {// e.printStackTrace();// }System.out.println("now all done.");// executorService.shutdown();}private static void mainThreadOtherWork() {System.out.println("main thread work start");try {Thread.sleep(3000L);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("main thread work done.");}public static class SubThread extends Thread{private BlockingQueue queue;/*** @param queue*/public SubThread(BlockingQueue queue) {this.queue = queue;}@Overridepublic void run() {try{working();}finally{try {queue.put(1);} catch (InterruptedException e) {e.printStackTrace();}}}private void working() {System.out.println("sub thread start working.");busy();System.out.println("sub thread stop working.");}private void busy() {try {sleep(5000L);} catch (InterruptedException e) {e.printStackTrace();}}}} |


|
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
public class Threads {// static ExecutorService executorService = Executors.newFixedThreadPool(1);static final BlockingQueue queue = new ArrayBlockingQueue(1);public static void main(String[] args) throws InterruptedException, ExecutionException {int threads = 5;CountDownLatch countDownLatch = new CountDownLatch(threads);for(int i=0;i<threads;i++){SubThread thread = new SubThread(2000*(i+1), countDownLatch);thread.start();}// Future future = executorService.submit(thread);mainThreadOtherWork();System.out.println("now waiting sub thread done.");// future.get();// queue.take();countDownLatch.await();// try {// thread.join();// } catch (InterruptedException e) {// e.printStackTrace();// }System.out.println("now all done.");// executorService.shutdown();}private static void mainThreadOtherWork() {System.out.println("main thread work start");try {Thread.sleep(3000L);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("main thread work done.");}public static class SubThread extends Thread{// private BlockingQueue queue;private CountDownLatch countDownLatch;private long work;/*** @param queue*/// public SubThread(BlockingQueue queue) {// this.queue = queue;// this.work = 5000L;// }public SubThread(long work, CountDownLatch countDownLatch) {// this.queue = queue;this.countDownLatch = countDownLatch;this.work = work;}@Overridepublic void run() {try{working();}finally{// try {// queue.put(1);// } catch (InterruptedException e) {// e.printStackTrace();// }countDownLatch.countDown();}}private void working() {System.out.println(getName()+" sub thread start working.");busy();System.out.println(getName()+" sub thread stop working.");}private void busy() {try {sleep(work);} catch (InterruptedException e) {e.printStackTrace();}}}} |
Java_如何等待子线程执行结束的更多相关文章
- Java如何等待子线程执行结束
工作中往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的产景, 这时候就需要使用线程了. 一个线程启动之后, 是异步的去执行需要执行的内容的, 不会影响主线 ...
- Java主线程如何等待子线程执行结束(转)
工作中往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的产景, 这时候就需要使用线程了. 一个线程启动之后, 是异步的去执行需要执行的内容的, 不会影响主线 ...
- Java多线程--让主线程等待子线程执行完毕
使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...
- Java线程池主线程等待子线程执行完成
今天讨论一个入门级的话题, 不然没东西更新对不起空间和域名~~ 工作总往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的产景, 这时候就需要使用线程了. 一 ...
- C#主线程等待子线程运行结束
佐左佑右 原文 C#主线程等待子线程运行结束 由于主程序中调用matlab的dll文件进行计算要用较长的时间,主界面会有很长时间的卡顿,造成的用户感受十分不好,因此我想在调用时,将调用放入子线程中,然 ...
- java多线程实现主线程等待子线程执行完问题
本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明: 1.使用Thread的join()方法,join()方法会阻塞主线程继续向下执行. 2.使用Java.util.concurrent中的C ...
- Java Thread.join()详解--父线程等待子线程结束后再结束
目录(?)[+] 阅读目录 一.使用方式. 二.为什么要用join()方法 三.join方法的作用 join 四.用实例来理解 打印结果: 打印结果: 五.从源码看join()方法 join是Th ...
- Java主线程等待子线程、线程池
public class TestThread extends Thread { public void run() { System.out.println(this.getName() + &qu ...
- Java并发编程原理与实战六:主线程等待子线程解决方案
本文将研究的是主线程等待所有子线程执行完成之后再继续往下执行的解决方案 public class TestThread extends Thread { public void run() { Sys ...
随机推荐
- http请求中的中文乱码问题
通过浏览器访问服务器页面和资源时,不可避免地要传送中文字串,如果客户机与服务器不能用同一码表解析字串,肯定会出现各种各样的乱码问题.我总结了几个乱码场景及解决办法,如下 1.服务器上的中文字串被客户端 ...
- docker强制关闭命令
删除容器: 优雅的关闭容器:docker stop 容器id/容器名字 强制关闭容器:docker kill 容器id/容器名字 删除镜像: docker rmi 容器id/容器名字
- 正则表达式之你不知道的replace
我们都知道js内置类String提供了一个replace方法,可以把指定字符串替换为另一个字符串,他的基础用法如下: var str="hello world"; var str= ...
- 应用服务器中对JDK的epoll空转bug的处理
原文链接:应用服务器中对JDK的epoll空转bug的处理 前面讲到了epoll的一些机制,与select和poll等传统古老的IO多路复用机制的一些区别,这些区别实质可以总结为一句话, 就是epol ...
- NFS服务简介
NFS服务简介 NFS是Network File System的缩写,即网络文件系统.NFS是由Sun开发并发展起来的一项用于在不同机器,不同操作系统之间通过网络互相分享各自的文件.NFS serve ...
- Oracle学习笔记:ORA-22992 cannot use LOB locators selected from remote tables
通过DB_LINK访问远程表的时候出现 ORA-22992: cannot use LOB locators selected from remote tables 错误. 原因:因为表中含有clob ...
- 一步一步学习IdentityServer4 (3)自定登录界面并实现业务登录操作
IdentityServer4 相对 IdentityServer3 在界面上要简单一些,拷贝demo基本就能搞定,做样式修改就行了 之前的文章已经有登录Idr4服务端操作了,新建了一个自己的站点 L ...
- Linux--忘记MySQL密码的解决方法和输入mysqld_safe --skip-grant-tables &后无法进入MySQL的解决方法
https://blog.csdn.net/qq_35389417/article/details/78910974
- CCF CSP 201709-3 JSON查询
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-3 JSON查询 问题描述 JSON (JavaScript Object Not ...
- centos6.8部署denyhosts设置sshd黑名单
DenyHosts是Python语言写的一个程序,它会分析sshd的日志文件(/var/log/secure),当发现重 复的攻击时就会记录IP到/etc/hosts.deny文件,从而达到自动屏IP ...