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 ...
- 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 ...
随机推荐
- Django 基于类的视图(CBV)执行流程 CBV 源码分析
一.CBV(基于类的视图) 视图是可以调用的,它接受请求并返回响应,这不仅仅是一个函数,Django提供了一些可以用作视图的类的例子,这些允许您通过继承或mixin来构建视图并重用代码. 基本示例 D ...
- shell脚本练习题->1
猜随机数的大小 描述: 写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,直接退出,否则让用户一直输入:并且提示用户输入的数字比预设数字大或者小 分析: 1:随机数字 ...
- idea中JDK失效
[问题] 在没有改变任何东西的情况下,突然间IDEA里面所有的代码都标红,无法找到JDK [解决方法] [File]->[Invalidate Caches],然后就好了
- 创建第一个MySQL数据库earth及表area
Windows 10家庭中文版,MySQL 5.7.20 for Win 64,2018-05-08 数据库earth描述: 用于记录地球上的事物,一期包含地理区域信息——表area. 字符集编码:u ...
- Git 撤销操作、删除文件和恢复文件
大致介绍 经过前面的学习,已经建立了版本库,并上传了文件,这次来学习对这些文件进行基本的操作,即: ◆ 撤销操作 ◆ 删除文件 ◆ 恢复文件 我在此之前,已经将三个文件提交到了版本库 撤销操作 撤销操 ...
- grail开发环境的搭建
本文参考:Grails入门指南(第二版) 1. 下载jdk和Grail http://www.oracle.com/technetwork/java/javase/downloads/ http:// ...
- 利用CE手动破解百度云下载限速!
一步,你需要打开百度云<ignore_js_op> 第二步,你需要用上面附送的工具选择百度云进程<ignore_js_op> 第三点,不多说,看图<ignore_js_o ...
- RabbitMQ系列之高可用集群
为了实现高可用,我采用LVS+双节点RabbitMq , 架构图如下: 在RabbitMQ之前放了LVS, LVS 采用 rr 轮询算法 , 目的是将请求平均分配到两个真实节点,并配置5672端口监控 ...
- 【LOJ】#2123. 「HEOI2015」最短不公共子串
题解 我们对于B串建出后缀自动机和序列自动机 对于问题1,枚举左端点然后跑后缀自动机,直到不能匹配作为这个左端点的答案 对于问题2,枚举左端点然后跑序列自动机,直到不能匹配 对于问题3,设f[i][j ...
- 异常类Exception(String message, Throwable cause)中的cause理解
这个在构造函数里面竟然有一个Throwable,感觉有些奇怪. 1. Throwable cause 这里cause要传一个Throwable的子类异常进去么? 是引起这个异常的异常,如果这个值是空值 ...