Java 多线程 (PART VII) 使用join()方法保证线程的执行顺序
来源:互联网 发布:淘宝网天猫女装棉衣 编辑:程序博客网 时间:2024/06/05 15:14
谁先被调用?
示例代码:
package a;class JoinThread extends Thread{ @Override public void run() { for(int i=0;i<10;i++) { System.out.println(this.currentThread().getName()+" "+i); } }}public class Join1 { public static void main(String[] args) { JoinThread join1=new JoinThread(); JoinThread join2=new JoinThread(); JoinThread join3=new JoinThread(); JoinThread join4=new JoinThread(); JoinThread join5=new JoinThread(); join1.start(); join2.start(); join3.start(); join4.start(); join5.start(); }}
在这段代码中,一共有6个线程将会被JVM创建。
运行的结果却和我们start的顺序不一样,这是因为这些线程都在Runnable状态,他们都可以被调度,而且先调用谁是随机的。
于是
输出结果:
Thread-1 0Thread-3 0Thread-2 0Thread-0 0Thread-4 0Thread-4 1Thread-0 1Thread-2 1Thread-2 2Thread-2 3Thread-2 4Thread-2 5Thread-2 6Thread-2 7Thread-2 8Thread-2 9Thread-3 1Thread-3 2Thread-3 3Thread-3 4Thread-3 5Thread-3 6Thread-3 7Thread-3 8Thread-3 9Thread-1 1Thread-1 2Thread-1 3Thread-1 4Thread-1 5Thread-1 6Thread-1 7Thread-1 8Thread-1 9Thread-0 2Thread-0 3Thread-0 4Thread-0 5Thread-0 6Thread-0 7Thread-0 8Thread-0 9Thread-4 2Thread-4 3Thread-4 4Thread-4 5Thread-4 6Thread-4 7Thread-4 8Thread-4 9
可以看到输出的结果非常混乱。
如何保证输出顺序与Start的顺序一致
这里需要用到join()方法;
join()方法的作用:
启动另一个线程并且本线程进入阻塞状态,等到被启动的线程执行完成或者无法继续执行时,本线程再进入就绪状态,等待被调用。
示例代码:
public class Join1 { public static void main(String[] args) { JoinThread join1=new JoinThread(); JoinThread join2=new JoinThread(); JoinThread join3=new JoinThread(); JoinThread join4=new JoinThread(); JoinThread join5=new JoinThread(); try { join1.start(); join1.join(); } catch (InterruptedException e) { e.printStackTrace(); } try { join2.start(); join2.join(); } catch (InterruptedException e) { e.printStackTrace(); } try { join3.start(); join3.join(); } catch (InterruptedException e) { e.printStackTrace(); } try { join4.start(); join4.join(); } catch (InterruptedException e) { e.printStackTrace(); } try { join5.start(); join5.join(); } catch (InterruptedException e) { e.printStackTrace(); } }}
这样便可以保证在一个线程运行完成之后才去启动另一个线程。
由此便可以保证输出的顺序就是代码里start的顺序。
输出结果:
Thread-0 0Thread-0 1Thread-0 2Thread-0 3Thread-0 4Thread-0 5Thread-0 6Thread-0 7Thread-0 8Thread-0 9Thread-1 0Thread-1 1Thread-1 2Thread-1 3Thread-1 4Thread-1 5Thread-1 6Thread-1 7Thread-1 8Thread-1 9Thread-2 0Thread-2 1Thread-2 2Thread-2 3Thread-2 4Thread-2 5Thread-2 6Thread-2 7Thread-2 8Thread-2 9Thread-3 0Thread-3 1Thread-3 2Thread-3 3Thread-3 4Thread-3 5Thread-3 6Thread-3 7Thread-3 8Thread-3 9Thread-4 0Thread-4 1Thread-4 2Thread-4 3Thread-4 4Thread-4 5Thread-4 6Thread-4 7Thread-4 8Thread-4 9
阅读全文
0 0
- Java 多线程 (PART VII) 使用join()方法保证线程的执行顺序
- Java 多线程 (PART XIX) 使用Condition实现线程的顺序执行
- Java多线程中join方法_保证线程执行完后再销毁activity
- java的join和yield方法处理线程顺序执行
- C#中Join()方法实现线程的顺序执行
- JAVA多线程顺序执行(使用join,lock,condition,信号量)原理和java源代码
- 如何保证线程执行的顺序
- join控制线程的执行顺序
- 如何保证线程顺序执行?
- 初学Java多线程:join方法的使用
- 初学Java多线程:join方法的使用
- 初学Java多线程:join方法的使用
- Java多线程之join方法的使用
- java多线程学习之使用join()方法实现线程插队
- Java线程5:join方法的使用
- Java多线程初学者指南(5):join方法的使用
- Java多线程初学者指南(5):join方法的使用
- Java多线程初学者指南(5):join方法的使用
- poj 3349
- 欢迎使用CSDN-markdown编辑器
- Codeforces 868 C Qualification Rounds
- Qt代码配色VS2015风格
- linux常用命令(面试)
- Java 多线程 (PART VII) 使用join()方法保证线程的执行顺序
- 再来一篇卡尔曼滤波器
- Windows7/10上配置OpenCV3.3.0-Python3.6.2操作步骤
- bzoj 1230: [Usaco2008 Nov]lites 开关灯
- Android学习-常见的UI控件 ToggleButton和CheckBox
- Socket通信
- HDU5988-Coding Contest
- Python2 字符串
- 基于OpenCV的视频图像组态 (1) :时钟