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{ @Override public 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{ @Override public 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; } @Override public 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; } @Override public 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 ...
随机推荐
- php查询mysql时,报超出内存错误(select count(distinct))时
学时服务器查询教练所带人数时,使用select count(distinct(u_STRNO))时报超出内存错误.后参考“mysqld-nt: Out of memory解决方法”http://jin ...
- python使用wxPython创建一个简单的文本编辑器。
ubuntu下通过'sudo apt-get install python-wxtools'下载wxPython.load和save函数用于加载和保存文件内容,button通过Bind函数绑定这两个函 ...
- gitlab的本地搭建和部署使用
公司现在的代码管理是在公司的服务器上部署了gitlab,这样既方便协同开发,有可以很好的保护代码的安全性. 那么我们就来研究一下 如何给自己的服务器上部署gitlab吧! 学习源头:https://w ...
- UDP协议相关解释
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层 ...
- biosdevname网卡命名方式
在前天通过了最后的 Go/No-Go 会议后,Fedora 15 已定于下周正式发布,这个永远站在开源技术最前沿的发行版,即将迎来又一个新的大的变动.作为 Fedora 用户,相信你已经习惯了每个新版 ...
- AppCan上下拉列表刷新
function initBounce(funcTop, funcBottom){ uexWindow.setBounce("1"); if (!funcTop && ...
- jmeter 打不开 提示“Not able to find Java executable or version”的解决办法
Not able to find Java executable or version. Please check your Java installation . errorlevel=2Not a ...
- java中求利息的代码
总结:函数的重要性,懂得用哪一种函数 package com.badu; import java.util.Scanner; //输入存款金额 money.存期 year 和年利率 rate, //根 ...
- 1024 Palindromic Number
题意: 给出一个数N(N<=10^10),最多可操作K次(K<=100),每次操作为这个数和其反转之后的数相加,若得到的结果为回文数,则输出:若在K次迭代后仍然不是回文数,在输出第K次操作 ...
- float型数据与字节数组的转化
float型数据与字节数组的转化 字节(float)浮点数为例. 一.C语言 转化常见的方法有: 1.强制指针类型转换. [html] view plain copy //转换float数据到字节数组 ...