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 ...
- .Net主线程扑捉子线程中的异常
首先看一段C#代码:运行后发现主线程通过try{}catch{}是不能扑捉子线程中的抛出来的异常. 代码 ); } public void run() { ...
- Java中主线程如何捕获子线程抛出的异常
首先明确线程代码的边界.其实很简单,Runnable接口的run方法所界定的边界就可以看作是线程代码的边界.Runnable接口中run方法原型如下: public void run(); 而所有的具 ...
- c/c++中主线程退出,子线程也会退出
#include <windows.h> #include <process.h> /* _beginthread, _endthread */ #include <io ...
随机推荐
- centos安装PHP-pdo支持pdo
#yum install php-pdo phpinfo()查看PDO
- 无敌JS关闭当前窗口代码,不弹出确认提示
echo "<script type='text/javascript'>window.opener=null;window.open('','_self');window.cl ...
- SpringMvc入门四----rest风格Url
知识点: REST风格URL简介 SpringMvc对rest风格的支持 @PathVariable 获取 Url 变量 SpringMvc对静态资源的处理 REST风格URL简介: 我们平时看到的s ...
- Python多线程-队列
队列就是存东西取东西,多用于多线程中 按照顺序 对传入的数据按规定的顺序输出 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" ...
- git commit 提交的时候,出现*** Please tell me who you are. git config --global 。。。问题
$ git commit -a -m 'v6' *** Please tell me who you are. Run git config --global user.email "you ...
- 03-CSS中的选择器
高级选择器分为: 后代选择器 子代选择器 并集选择器 交集选择器 后代选择器 使用空格表示后代选择器 , 顾名思义 父元素的后代(包括儿子,孙子,重孙子) 中间空格隔开 是后代 .container ...
- Android 4 学习(14):Internet Resources
参考<Professional Android 4 Development> 使用Internet资源 打开URI String myFeed = getString(R.string.m ...
- Centos下nginx支持https协议
1.首先配置nginx及其他插件,这个Google下,很多配置方案. 2.配置服务器的证书.操作步骤如下: [root@localhost ~]# cd /etc/pki/tls/certs [roo ...
- 成都国嵌-嵌入式linux必修实验手册…
emouse收集整理,转载请注明: emouse的技术专栏 博客园:http://www.cnblogs.com/emouse/ CSDN:http://blog.csdn.net/haozi_198 ...
- Perl 变量:标量变量、数组变量、哈希变量和变量上下文
一.Perl 变量变量是存储在内存中的数据,创建一个变量即会在内存上开辟一个空间.解释器会根据变量的类型来决定其在内存中的存储空间,因此你可以为变量分配不同的数据类型,如整型.浮点型.字符串等.上一章 ...